求 m^n % k (快速幂):
// m^n % k
int quickpow(int m,int n,int k)
{
int b = 1;
while (n > 0)
{
if (n & 1)
b = (b * m) % k;
n = n >> 1 ;
m = (m * m) % k;
}
return b;
}
快速幂,通过将n转换成二进制的方法优化运算。
例如n = 37 的时候 37 = 2^5 + 2^2 + 2^0
那么m^37 % k = m^(2^5 + 2^2 + 2^0) % k = m^(2^5) * m^(2^2) * m^(2^0) % k
原本需要 b = b * m % k; 循环37次的算法现在可以转化为一种新的算法
m = (m * m) % k; 在 i 次操作后 m = m^(2^i)
n = n >> 1; 在 i 次操作后 n 表示 n 的二进制形式去掉最后 i 位的值
if (n & 1) 表示此时n在二进制情况下最低位为1,接下来就乘上去
时间复杂度O(log n)
//以快速幂作为一个开始,用严肃的态度行走自己的ACM之路。