本文共 1783 字,大约阅读时间需要 5 分钟。
求 a b a^b ab m o d mod mod p p p 的值。
三个整数 a a a , b b b , p p p ,在同一行用空格隔开。
输出一个整数,表示 a b a^b ab m o d mod mod p p p 的值。
0 0 0 ≤ \leq ≤ a a a , b b b ≤ \leq ≤ 1 0 9 10^9 109
1 1 1 ≤ \leq ≤ p p p ≤ \leq ≤ 1 0 9 10^9 1093 2 7
2
直接使用C++中的 p o w ( a , b ) pow(a,b) pow(a,b) 函数计算 a a a的 b b b次方(当然也可以通过for循环实现此函数),再将最后的结果 m o d mod mod p p p
考虑到本题的数据范围过大,取模前的结果可能非常的大,因此选择使用 u n s i g n e d unsigned unsigned l o n g long long l o n g long long 存储该结果#includeusing namespace std;long long a,b,p;//unsigned long long power(long long a,long long b) //手写pow函数 //{ // long long result=1;// for(int i=1;i<=b;i++)// result=result*a;// return result;//}int main(){ cin>>a>>b>>p; unsigned long long x; x=pow(a,b);// x=power(a,b); cout<
在算法1的基础上进行优化
依据取模运算中的 ( a (a (a × \times × b ) b) b) m o d mod mod p p p = = = ( a (a (a m o d mod mod p p p × \times × b b b m o d mod mod p ) p) p) m o d mod mod p p p (取模运算具体内容可参考 ) 可以解决空间上的问题,即在每次进行乘法的过程中取模,防止最后的结果过大#includeusing namespace std;long long a,b,p;long long power(long long a,long long b){ long long result=1; for(int i=1;i<=b;i++) { result=result*a; result%=p; } return result%p;}int main(){ cin>>a>>b>>p; cout<
通过取模运算解决上了空间的问题,能够计算出正确的结果
但由于b的值过大,循环次数非常多,出现了时间问题 通过快速幂来解决时间问题(快速幂具体内容可参考 ) 为了进一步加快时间,可以使用位运算来进行操作#includeusing namespace std;long long a,b,p;long long power(long long a,long long b) { long long result=1; while(b>0) { if(b&1) result=result*a%p; //b&1等价于b%2==1 b>>=1; //power>>=1等价于power=power/2 a=(a*a)%p; } return result%p;}int main(){ cin>>a>>b>>p; cout<
转载地址:http://lnho.baihongyu.com/