快速幂+费马小定理的简单应用
参考:
(49条消息) 快速幂算法(全网最详细地带你从零开始一步一步优化)_刘扬俊的博客-CSDN博客_快速幂算法
(a + b) % p = (a % p + b % p) % p (1)
(a - b) % p = (a % p - b % p ) % p (2)
(a * b) % p = (a % p * b % p) % p (3)
核心:
若幂指数不为0,幂指数变为原来的一半,基数等于基数的平方
计算所有幂指数为奇数项的乘积。
1.用power&1代替power%2!=0:
如果power为偶数,则其二进制表示的最后一位一定是0;如果power是奇数,则其二进制表示的最后一位一定是1。将他们分别与1的二进制做“与”运算,得到的就是power二进制最后一位的数字了,是0则为偶数,是1则为奇数。
2.对于power=power/2来说,也可以用更快的“位运算”进行替代,我们只要把power的二进制表示向右移动1位就能变成原来的一半了。
1 //模板 2 long long fastPower(long long base, long long power) { 3 long long result = 1; 4 while (power > 0) { 5 if (power & 1) {//此处等价于if(power%2==1) 6 result = result * base % 1000; 7 } 8 power >>= 1;//此处等价于power=power/2 9 base = (base * base) % 1000; 10 } 11 return result; 12 }
1 //2的1000000000次方的后三位 2 #include<bits/stdc++.h> 3 using namespace std; 4 long long fastpower(int base,int power) 5 { 6 long long r=1; 7 while(power>0) 8 { 9 if(power&1) 10 { 11 r=r*base%1000; 12 } 13 power>>=1; 14 base=base*base%1000; 15 } 16 return r; 17 } 18 int main() 19 { 20 long long base,power; 21 cin>>base>>power; 22 cout<<fastpower(base,power)<<endl; 23 return 0; 24 }

扩展:
费马小定理:
A^B%p=[A^B%(P-1)]%P;
例:
求(A^B^C)%P;
因为:A^B=[A^B%(P-1)]%P
所以把B换成B^C得:
A^B=[A^(B^C)%(P-1)]%P
输入格式
一行,三个整数A,B,C,以空格隔开。
输出格式
输出A的B的C次方次方%1,000,000,007。
样例输入
3 4 5
样例输出
763327764
数据规模和约定
0≤A,B,C≤1,000,000,000
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 ll power(ll a,ll b,ll p) 5 { 6 ll ans=1; 7 while(b>0) 8 { 9 if(b&1) 10 ans=ans*a%p; 11 b>>=1; 12 a=a*a%p; 13 } 14 return ans; 15 } 16 int main() 17 { 18 ll a,b,c; 19 cin>>a>>b>>c; 20 ll p=1000000007; 21 cout<<power(a,power(b,c,p-1),p)<<endl; 22 }


浙公网安备 33010602011771号