快速算底数的n次幂,时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。例如:
例如
11的二进制是1011
因此,我们将a¹¹转化为
//base为底数
int fastpow(int base, int n, int mod){
int ans = 1;
while (n) {
//指数二进制位为1时,乘入结果
if (n & 1) ans *= base % mod;
//增加次方
base *= base;
n >>= 1;
}
return ans % mod;
}
取模是避免溢出,因为幂运算结果可能太大。同模原理:
A*B % C = (A%C * B%C)%C
(A+B)%C = (A%C + B%C)%C
矩阵快速幂:底数换成矩阵,同样乘法运算。例题:
https://leetcode-c