算法数学原理:积的取余等于取余的积的取余。
递归:
long long binaryPow(long long a,long long b,long long mode){
if(b == 0) return 1; //递归出口,分解到指数b等于0
if(b & 1) return a * binaryPow(a, b-1, mode) % mode;//当指数为奇数时 b&1来判断b的二进制最后一位是否是1计算更快一些。
else{ //b为偶数时
long long mul = binaryPow(a, b / 2, m);
return mul * mul % mode;
}
}
注意:当b为偶数时不要写成
return binaryPow(a, b / 2, m) * binaryPow(a, b / 2, m)
这样的时间复杂度是仍然为O(b):例如求binaryPow(8) = binaryPow(4)+binaryPow(4)=8次binaryPow(1)
而正确写法如else中 时间复杂度为O(logb)
迭代法:
b可以分解为2^2k + ········+2^3+2^2+2^1+2^0
因此a^b可以进行分解a^2k ,·········,a^8,a^4,a^2,a^1中若干项的乘积。
long long binaryPow(long long a,long long b,long long mode){
long long ans = 1;
while(b > 0){
if(b & 1){ // b的二进制末尾是1
ans = ans * a % mode;
}
a = a * a % mode;
b >>= 1;
}
return ans;
}