快速幂
O(n)的方法:
an=a* a* …a*…
n大就会超时
O(log2n)的方法:
方法一:
先算a2再算(a2)2一直到n次幂,判断一下奇偶数
int fastpow(int a,int n){//a^n
if(n==1) return a;
int t=fastpow(a,n/2);
if(n&1){
return t*t*a;
}else{
return t*t;
}
}
方法二:
根据n的二进制来算:
int fastpow(int a,int n){//a^n
int ans=1;
while(n){
if(n&1){
ans*=a;
}
a*=a;
n>>=1;
}
return ans;
}
快速幂取模
举例上述法二,多加个参数就行了,代码如下:
int fastpow(int a,int n,int b){
int ans=1;
while(n){
if(n&1){
ans=(ans*a)%b;
}
a=(a*a)%b;
n>>=1;
}
return ans%b;
}
快速乘
因为在快速幂中可能会出现a*a爆long long所以需要快速乘
代码:
int fastmul(int a,int b,int c){
int ans=0;
while(b){
if(b&1){
ans=(ans+a)%c;
}
a=(a<<1)%c;
b>>=1;
}
return ans;
}
int fastpow(int a,int n,int b){
int ans=1;
while(n){
if(n&1){
ans=fastmul(ans,a,b);
}
a=fastmul(a,a,b);
n>>=1;
}
return ans%b;
}
另外还有 O(1)的快速乘
图片截图自https://www.cnblogs.com/812-xiao-wen/p/10543023.html