概念:
平常在求a^b时,如果b很大的话,复杂度就达到了O(b)
快速幂就可以降低到O(logb)
PAT:
(1)如果a很大就只能用高精度处理大数
(2)如果n过大,比如10^20000000,可以用“欧拉降幂”数论方法(有时可以用循环节,或者是字符串快速幂)
先上模板
模板:
const int mod = 1e9 + 7;
ll qpow(ll a,ll b){
ll res=1;
a%=mod;
while(b){
if(b&1)res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
证明:
a^b
PTA:这里a防止溢出,在一开始要mod一下
可以将b转化为2进制数
比如2的105次幂
105=1+8+32+64
105的二进制数为 1 1 0 1 0 0 1
n % 2 可以用位运算替换 n & 1
1 1 0 1 0 0 1
0 0 0 0 0 0 1
&————————
= 0 0 0 0 0 0 1
0 0 1 1 0 1 0
0 0 0 0 0 0 1
&———————— ......
= 0 0 0 0 0 0 0
依次类推
n=n/2 也可以相当于时 n右移一位>> n>>1(二进制的移动)
n=1 1 1 0 1 1 n>>1 1 1 1 0 1
对于一个整数n来说,它的二进制数位为1+[log2(n)](向下取整)
即 n(bin)=1+floor(log2(n))