快速幂
快速幂:
ab:a的b次方:
(1)a*a*a.....需要乘b次,如果b过大(109),时间复杂度高
(2)快速幂:
将b二进制表示:
b=c1*2k+c2*2k-1+...ck+1*20
这样ab转化为一系列a2^x的连乘积,
进行预处理。
最后是否乘a2^x取决于b所对应的二进制位上为1还是为0。
例题:
求a^b,结果对取模:
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 5 6 int main() 7 { 8 long long ans; 9 long long a,b,p; 10 cin >> a >> b >> p; 11 ans = 1 % p; 12 while(b){ 13 if(b&1) //拿最后一位 14 ans = ans * a % p; 15 a = a * a % p; 16 b >>= 1; //去掉最后一位 17 } 18 cout << ans << endl; 19 return 0; 20 }
求a*b,对p取模:
同样可以对b进行拆分
1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 long long a,b,p; 7 cin >> a >> b >> p; 8 long long ans=0; 9 while(b){ 10 if(b&1) 11 ans = (ans + a) % p; 12 a = a * 2 % p; 13 b >>= 1; 14 } 15 cout << ans << endl; 16 return 0; 17 }