给定三个正整数a,b,m(a<10^9,b<10^18,1<m<10^9),求a^b%m
注意到,b的取值,如果简单的直接计算a^b那肯定会超时。所以我们采取快速幂的做法。
快速幂,基于二分的思想,基本原理如下:
1.如果b是偶数,那么;
2.如果b是奇数,那么
显然无论b是奇数,最后都是变为偶数,进行二分处理。基于以上思路,我们容易想到递归的算法,临界条件是当b=0,返回1.
long long binaryPow(ll a,ll b,ll m)
{
if(b==0) return 1;
if(b%2==1) return a*binaryPow(a,b-1,m)%m; //对每一次都进行模计算,减少数据规模
else{
ll temp=binaryPow(a,b/2,m);
return temp*temp%m;
}
注意
1. 最后我们不直接return binaryPow(a,b/2,m)*binaryPow(a,b/2,m),因为如果这样写会调用两次binarryPow(a,b/2,m);
2.如果初始时a>=m,那么我们要在进入函数先让a=a%m;
3.如果m==1,那么直接在函数外判断等于0