引言:
如果我们计算a的k次幂,循环k次每次 × a,时间复杂度O(k),现在我们要把其优化为log(k)的时间复杂度。另外a的k次幂极有可能报long long,比如2的64次幂就已经爆long long 了,所以在k很小的时候就会爆掉long long,所以题目肯定会取余,但是2的63次幂成2在取余,在相乘的过程中就已经爆掉long long了,取余也是不正确的。
所以要A*B%mod == A % mod * B % mod就可以了
注意:A / B % mod != A % mod / B % mod
证明:
在看一下y总的图:
这就是要预处理的logk + 1个数
题目:
代码:
#include <iostream>
using namespace std;
int n;
int qmi(int a, int k, int p)
{
int res = 1;
while (k)
{
if (k & 1) res = (long long)res * a % p;
k >>= 1;
a = (long long)a * a % p;
}
return res;
}
int main()
{
cin >> n;
while (n--)
{
int a, k, p;
cin >> a >> k >> p;
cout << qmi(a, k ,p) << endl;
}
return 0;
}