快速幂
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
即 求m^k mod p; 时间复杂度O(logk)
代码如下
int qmi(int m, int k, int p)
{
int res = 1 % p, t = m;
while (k)
{
if (k&1) res = res * t % p;
t = t * t % p;
k >>= 1;
}
return res;
}
//如果返回值很大可能需要long long 或是高精度
直接求m^k需要从1到k扫一遍,时间复杂度O(n);
快速幂是将k用二进制思想优化
例如取m=3,k=7;
7的二进制为0111
7 = 0 * 2^3 +1 * 2^2 +1 * 2^1 +1 * 2^0;
因此
3^7 = 3^(1+2+4) = 3^1 * 3^2 * 3^4
而其中
3^1, 3^2 , 3^4
这些都是可以通过前一个数平方而来,不需要从头到尾遍历计算
k次方则需要计算到logk
因此时间复杂度是logk