快速幂
快速幂模板:
int qmi(int m, int k, int p)
{
int res = 1 % p, m;
while (k)
{
if (k&1) res = res * m % p;
m = m * m % p;
k >>= 1;
}
return res;
}
时间复杂度为O(logk).
res = 1 % p 这样初始化是因为要考虑 P=1 时的情况。
if (k&1) res = res * m % p; m = m * m % p;
这两句的具体实现方式与m 与 k之间的具体关系有关,并不完全确定。模板中写的是乘方关系下的运算。
另一种常见的是相乘的关系。这是可以表示为;
if(k&1)res = (res + m ) % p; m = (m + m) % p;
如果有溢出问题,可以修改成一下模式;
if (k&1) res = res * 1ll * m % p; m = m * 1ll * m % p;