快速幂
洛谷P1226就是快速幂的一个模板题:
输入b,p,k;求b的k次方除以k的值。数据范围 0 ≤ b , p , 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 }