快速幂

洛谷P1226就是快速幂的一个模板题:

 

输入b,p,k;求b的k次方除以k的值。数据范围 ≤ 2^31;

若按之前的方法用循环求 b^p的话,时间复杂度O(n),并且数据会很大,部分测试点

就会超时;

所以,就用到了快速幂:

比如求 2^64   (2^32)^2  => ((2^16)^2)^2  =>……一直将指数  / 2  这样就

将复杂度O(n)降到了O(log n),速度就会快很多。

要做这个题 还要知道

(a1*a2*a3*……*an) mod p

=(a1 mod p * a2 mod p * a3 mod p * ……*an mod p) mod p;

所以这个题就可以定义递归函数了:

1 int ksm(int x,int y,int p)
2 {
3     if (y==0) return 1;
4     int z = ksm(x,y/2,p);
5     z = 1ll*z*z%p;
6     if (y%2==1) z=1ll*z*x%p;
7     return z;
8 }

其中 1ll 是将z强制类型转换 防止 z * z 太大,爆 int;

完整代码:

 1 #include<iostream>
 2 using namespace std;
 3 int ksm(int x,int y,int p)
 4 {
 5     if (y==0) return 1;
 6     int z = ksm(x,y/2,p);
 7     z = 1ll*z*z%p;
 8     if (y%2==1) z=1ll*z*x%p;
 9     return z;
10 }
11 int main()
12 {
13     int b,p,k;
14     cin>>b>>p>>k;
15     cout<<b<<"^"<<p<<" mod "<<k<<"="<<ksm(b,p,k)%k;
16     return 0;
17 }

 

posted @ 2020-03-09 11:28  zkw666  阅读(152)  评论(0编辑  收藏  举报