a^b(快速幂) 求 a 的 b 次方对 p 取模的值。

题目详情

求 a 的 b 次方对 p 取模的值。

输入格式

三个整数 a,b,p在同一行用空格隔开。

输出格式

输出一个整数,表示a^b mod p的值。

数据范围

0≤a,b,p≤10^9

输入样例:

3 2 7

输出样例:

2

问题解决

正常来说,计算机每秒可运算10^7-10^8次(以c++语言来说)所以这题如果用循环一个个的来乘,最大有10^9的运算量,有可能超时。应采用快速幂算法,运算量则会降为log级别的!

以上面提供的数据来说明 快速幂:

7转化为二进制为1112^0=12^1=22^2=42^3=8……

3^7=3^111(111为二进制状态)3^7=3^1*3^2*3^4(7=1+2+4)

每一项是上一项的平方……

详细代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 int power(int a,int b,int p)
 5 {
 6     int ans=1%p;
 7     while(b)//不为零执行该操作
 8     {
 9         if(b&1) ans=1ll*ans*a%p;//if(b&1)判断该位是否为1
10         a=1ll*a*a%p;//1ll*a等价于(long long)a  转化为long long型防止数组越界(此处不是三个1,而是1LL)
11         b>>=1;//考虑下一位
12     }
13     return ans;
14 }
15
16 int main()
17 {
18     int a,b,p,res;
19     cin>>a>>b>>p;
20     res=power(a,b,p);
21     cout<<res;
22     return 0;
23 }
 

原文地址:https://www.cnblogs.com/wiac/p/11343186.html

时间: 2024-10-21 04:48:53

a^b(快速幂) 求 a 的 b 次方对 p 取模的值。的相关文章

POJ 3070-Fibonacci(矩阵快速幂求斐波那契数列)

Fibonacci Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3070 Appoint description:  System Crawler  (2015-02-28) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 +

poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)

题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数.如果后四位全为0,则输出0,否则 输出后四位去掉前导0,也...就...是...说...输出Fn%10000. 题目说的如此清楚..我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后 去掉前导0.o(╯□╰)o 还有矩阵快速幂的幂是0时要特判. P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶! #include<cstdio> #include<iostream>

hdu 3221 Brute-force Algorithm(快速幂取模,矩阵快速幂求fib)

http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序,问funny函数调用了多少次. 我们定义数组为所求:f[1] = a,f[2] = b, f[3] = f[2]*f[3]......f[n] = f[n-1]*f[n-2].对应的值表示也可为a^1*b^0%p,a^0*b^1%p,a^1*b^1%p,.....a^fib[n-3]*b^fib[n-2]%p.即a,b的指数从n=3以后与fib数列

数论——快速幂,模运算及快速幂求逆元

一.快速幂 原理: 快速幂的原理十分简单. ak=a2^0*a2^1*a2^2*…a2^x,其中k=20+21+22+…+2x. 这显然是正确的.因为任何一个数都可以表示成二进制. 接下去利用位运算实现即可. 代码实现 模板题链接:快速幂 代码模板如下:时间复杂度O(logk) int qmi(int a,int k,int p) { int res=1%p; while(k) { if(k&1)res=(long long)res*a%p; a=(long long)a*a%p; k>&g

poj 3070 Fibonacci 【矩阵快速幂 求第N个斐波那契数%1000】

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11123   Accepted: 7913 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 + Fn ? 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequenc

hdu4686 简单的矩阵快速幂求前n项和

HDU4686 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 题意:题目说的很清楚了,英语不好的猜也该猜懂了,就是求一个表达式的前n项和,矩阵快速幂一般多加一行一列来完成这个加的操作.具体看代码吧.比较简单,唯一有一点坑的地方,就是ax和bx可能比较大,在求ax*bx的时候,要考虑溢出的问题,需要先mod.其他没有了,直接看代码吧! //Author: xiaowuga #include <bits/stdc++.h> #define

poj 3070 Fibonacci(矩阵快速幂求Fibonacci数列)

题目链接: http://poj.org/problem?id=3070 题意: 我们知道斐波那契数列0 1 1 2 3 5 8 13-- 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. 思路: 这里的n很大,有10^9,for一遍肯定是不可以的. 所以要用矩阵乘法求斐波那契数列. f[n+1] = f[n]+f[n-1] f[n] = f[n] 构造以下矩阵,n次幂,mat[1][0] 就是答案 1 1 1 0 求矩

hdu 2837 Calculation【欧拉函数,快速幂求指数循环节】

欢迎关注__Xiong的博客: http://blog.csdn.net/acmore_xiong?viewmode=list Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1912    Accepted Submission(s): 413 链接:click me Problem Description A

UVA11149 Power of Matrix(快速幂求等比矩阵和)

题面 \(solution:\) 首先这一题是\(UVA11149\)的题目,建议到\(vjudge\)上去测,没办法\(UVA\)太难注册了.然后其原题与本题不是完全一样的,毒瘤卡输出!但思想一模一样! 首先,如果题目只要我们求\(A^K\) 那这一题我们可以直接模版矩乘快速幂来做,但是它现在让我们求$\sum_{i=1}^{k}{(A^i)} $ 所以我们思考一下这两者是否有什么关系.仔细一想,不难发现几个东西: 一次矩阵乘法复杂度为\(O(n^3)\),所以我们不能进行太多次矩阵乘法 快速