快速幂学习随笔
在我们日常运算a^b时,可以通过循环b次得到结果,但显而易见的是
如果b的值很大,会超时,于是我们就用快速幂来计算a^b。
快速幂的基本思想是分治。
首先,a^b=a^b/2*a^b/2;如果我们算出了a^b/2再用乘法计算a,我们的
复杂度就可以减少一半,同理也可以得到a^b/2=a^b/4*a^b/4;这样不断
分治下去,最后b会得到1,我们可以通过递归实现这个过程,最后我
们可以把复杂度降到 O(logn)。
Code:
#include<cstdio> #include<iostream> using namespace std; long long a,b; int quickpow(int x,int y) {
if(y==0) return 1; if(y==1) return x; if(y%2==0) { long long t=quickpow(x,y/2); return t*t; } else { long long t=quickpow(x,y/2); t=t*t; t=t*x; return t; } return 0; } int main() { cin>>a>>b; long long tot=quickpow(a,b); printf("%lld",tot); return 0; }
注意这里的b>=0,且b是整数;
如果b<0需要特殊处理或b是分数须再处理.
如果有取模运算的代码(洛谷P1226)
#include<cstdio> #include<iostream> using namespace std; long long a,b; int k; int quickpow(int x,int y,int m) { if(y==0) return 1%m; if(y==1) return x%m; if(y%2==0) { long long t=quickpow(x,y/2,m); return t*t%m; } else { long long t=quickpow(x,y/2,m); t=t*t%m; t=t*x%m; return t; } return 0; } int main() { cin>>a>>b>>k; long long tot=quickpow(a,b,k); printf("%lld^%lld mod %d=%lld",a,b,k,tot); return 0; }
蒟蒻的博客,大牛请指出不足。