大佬详细的讲解:转
例题:
给定三个整数,a,b,c(a <10^ 9 、b < 10^ 18 ,1<m<10^ 9),求 (a^b)%m
基本思想:
快速幂基于二分的思想,也称为二分幂。快速幂基于以下事实:
- 如果b 是奇数,则有a^b = a*a^(b-1)
- 如果b 是偶数, 则有a^b = a^(b/2) * a^(b/2)
显然,b是奇数的情况下总可以在下一步转化为b为偶数的情况,而b是偶数的情况总是可以在下一步转换为 b/2 的情况。这样,在log(b) 级别次数的转换后,就可以把b转换为0,而任何数的0次方都是1.
递归写法:
ll Pow(ll a,ll b,ll m){
if(b == 0)
return 1;
if(b%2 == 1) //b为奇数时,转换为b-1次方
return a*Pow(a,b-1,m)%m;
else{ //b为偶数时
LL mul = Pow(a,b/2,m);
return mul*mul%m;
}
}
- 如果初始时a有可能大于等于m,那么需要在进入函数前就让 a对 m 取模
迭代写法:
typedef long long ll;
ll Pow(ll a,ll b,ll m){
ll ans = 1;
while(b > 0){
if(b & 1){ //或者写为 if(b%2) ,当b为奇数时
ans = ans*a%m;
}
a = a*a%m;
b >>= 1; //b的二进制右移一位,或写为 b /= 2
}
return ans;
}