给出三个正整数a ,b, m, (a < 1e9, b < 1e18, 1< m < 1e9 ) 求a的b次幂 % m
a,b, m都是很大很大的数,以至于正常方法做基本都会溢出
这个时候就可以用二分幂(快速幂),实质是和二分查找是一样一样的,二分查找是通过left 和right 不断缩小范围逼近正确结果,二分幂就是不断拆分ab次幂,直到拆到不能再拆为止,计算出结果,然后利用该结果计算出上一步的结果,这也就是递归的思想了,那么该如何拆分呢?
如果b是奇数,那么有 ab = a * ab-1
如果b是偶数,那么有ab = ab/2 + ab/2
最终结果一定可以拆成 a1 * a0
递归边界就是 a0= 1
上代码
long long binaryPow(int a, int b, int m)
{
if(b == 0) return 1; //a^0 = 1
else if( b & 1) // 就是b %2 == 1,不过位运算&效率更高
{
return a * binaryPow(a, b - 1, m) % m;
}
else
{
long long mul = binaryPow(a, b /2, m);
return mul * mul % m;
}
}
i