今天,我又回忆起了“麦森数”这道题,想起了快速幂。
代码:
long long fast_pow(long long a,long long b,long long p){//a、b表示a的b次方,并且模p
long long ans=1; //ans为答案
while(b){
if(b&1) ans=ans*a%p;//若b当前最右位为1
a=a*a%p;
b>>=1;//b向右移一位
}
return ans;
}
(a^1)^2=a^2,(a^2)^2=a^4……,也就是说对于a^(2^k),我们都可以经过k次相乘得
到,我们应尽量将a^b分解成这样累乘的形式,即将b分解成2^k相加的形式。要将b分解
成2^k相加的形式,我们可以将b转换成二进制来完成,比如13=1+4+8=00001101,
二进制下的1的位置就是分解后各项2^k的k。