Codevs1497取余运算题解

  • 题目描述 Description

    输入b,p,k的值,编程计算bpmodk的值。其中的b,p,k*k为长整型数(231范围内)。

  • 输入描述 Input Description

    b p k

  • 输出描述 Output Description

    输出b^p mod k=?

    ‘=’左右没有空格

  • 样例输入 Sample Input

    2 10 9

  • 样例输出 Sample Output

    2^10 mod 9=7

  • 题解

    这里p的值比较大,不能直接上快速幂。要用到一个公式:

    bpmodk=bpmodφ(k)+φ(k)modk,(p≥φ(k)),其中φ(k)表示k的欧拉函数值,具体证明请自行参照网络资料。

    这样就把p放缩到2?φ(k)的范围里了,然后进行快速幂即可通过本题。

  • Code
#include <iostream>
#include <algorithm>
using namespace std;
int b, p, k, phi[1 << 17];
void eulerPhi(int n)//筛出前n个数的欧拉函数,其实只要求出k的欧拉函数值即可
{
    phi[1] = 1;
    for(int i = 2; i <= n; ++i) if(phi[i] == 0)
        for(int j = i; j <= n; j += i)
        {
            if(phi[j] == 0) phi[j] = j;
            phi[j] = phi[j] / i * (i-1);
        }
}
int qpow(int a, int n, int m)//对m取模的a的n次方快速幂
{
    int ans = 1;
    for(int t = a; n != 0; n >>= 1, t = (t % m) * (t % m) % m)
        if(n & 1) ans = (ans % m) * (t % m) % m;
    return ans;
}
int main()
{
    cin >> b >> p >> k;
    cout << b << "^" << p << " mod " << k << "=";
    eulerPhi(k);
    while(p >= 2*phi[k]) p = p % phi[k] + phi[k];//用上述公式缩小p
    cout << qpow(b, p, k) << endl;
    return 0;
}
时间: 2024-07-29 08:30:13

Codevs1497取余运算题解的相关文章

1497 取余运算

1497 取余运算 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 输入b,p,k的值,编程计算bp mod k的值.其中的b,p,k*k为长整型数(2^31范围内). 输入描述 Input Description b p k 输出描述 Output Description 输出b^p mod k=? =左右没有空格 样例输入 Sample Input 2  10  9 样例输出 Sample Outp

【分治】取余运算

问题 E: [分治]取余运算 时间限制: 1 Sec  内存限制: 128 MB提交: 16  解决: 6[提交][状态][讨论版] 题目描述 输入b,p,k的值,求bp mod k的值.其中b,p,k*k为长整型数. 输入 三个整数,分别为b,p,k的值 输出 bp mod k 样例输入 2 10 9 样例输出 2^10 mod 9=7 提示 解题思路:分治,顾名思义,把一个大问题分解为多个小问题. 这里有一个公式,利用这个公式通过递归求得. 代码: #include <iostream>

Luogu P1226 取余运算||快速幂(数论,分治)

P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^p mod k=s" s为运算结果 输入输出样例 输入样例#1: 2 10 9 输出样例#1: 2^10 mod 9=7 这是一道很有趣的水题,如果知道公式. 一般求解会溢出,导致答案错误. 这里介绍取模的一个公式: a*b%k=(a%k)*(b%k)%k. 在我们这道题中是b^p = (b^(p/

codevs 1497取余运算

1497 取余运算 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamon 题目描述 Description 输入b,p,k的值,编程计算bp mod k的值.其中的b,p,k*k为长整型数(2^31范围内). 输入描述 Input Description b p k 输出描述 Output Description 输出b^p mod k=? =左右没有空格 样例输入 Sample Input 2  10  9 样例输出 Sample Output 2^10 mod

洛谷——P1226 取余运算||快速幂

P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 输入输出样例 输入样例#1: 复制 2 10 9 输出样例#1: 复制 2^10 mod 9=7 快速幂取膜版 #include<cstdio> #include<cstring> #include<iostream> #include<al

为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash&amp;(h-1)=hash%h)位运算公式等价于取余运算?

1.什么是hash表? 答:简单回答散列表,运算在hash结构散列(分散)存放. 2.如何散列排布,如果均匀排布? 答:取余运算 3.Java中如何实现? 答:hash&(h-1) 4.为什么hash&(h-1)=等价于hash%h java的h(表长)一定是2的指数次幂,2的指数次幂2n 2n的结果:一定长这样10000...(n个0) 2n-1的结果:一定这样1111(n-1)个1 举个例子: 当h=16,对应的二进制:00010000 h-1=15,对应的二进制:00001111 可

Math——取模运算及取余运算

取模运算及取余运算 取余运算(Complementation)即我们小学时学的数学算术概念,而取模运算(Modulus Operation)常用于程序设计中 公式 a%b = a - (a/b * b) 取整运算 要明白取模运算和取余运算之间的区别,首先要了解取整运算(Round Operation) 取整运算常用的有三种,向负无穷取整,向正无穷取整,向零取整 以lua语言为例,lua的math数学库提供三个取整函数,floor向负无穷取整,ceil向正无穷取整,modf向零取整 (PS:lua

取余运算||快速幂

题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^p mod k=s" s为运算结果 思路: 显然取余和乘法谁都会 关键在于快速 我们知道乘方有一个性质 x^n=(x^2)^(n/2) 这样我们就能通过二分使时间复杂度降到log级别 你可能会说,n%2==1怎么办?? 和简单,再定义一个变量作为暂存器,乘一下x 这时候又有另一个定理 x^n=x^(n-1)*x 所以n可以减一 最

洛谷 P1226 取余运算||快速幂 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 输入输出样例 输入样例#1: 2 10 9 输出样例#1: 2^10 mod 9=7 快速幂模板. AC代码: 1 #include<io