快速幂

快速幂:


 

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 }

 

posted @ 2021-01-17 19:23  lhqwd  阅读(43)  评论(0)    收藏  举报