as we all know,
快速幂是一种实现a ^ k % p的算法
如果直接暴力搜的话,我们知道那是一中O(n)的实现
the core code is it
ll sum = 1;
for(int = 0; i < k; i++)
{
sum = sum * a % q;
}
cout << sum << endl;
但是的这种算法对于1e9的计算量实在实在是有些相形见绌了
所以就有了快速幂这样的一个算法
而这个算法的核心在于
如图
将问题转化为预处理这个区间内所有的值
这样就能将这个问题转化为logn的复杂度了
我们以4的3次方取模10为例子
这样代码的实现就很容易了
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
int qml(int a, int b, int q)
{
int res = 1;
while(k){//只要这个k不为空
if(k & 1)res = (ll)res * a % p;//如果这个数的二进制位为1那么就是乘上去
k >>= 1;//右移一位
a = (ll)a * a % p;//预处理炒作,当然你也可以记录一个变量表现一个相差的次数,但是两个相隔太远会爆ll
}
return ans;
}
int main(){
scanf("%d", &n);//读入测试案例
while(n--)
{
int a, b, p;
scanf("%d%d%d", &a, &b, &p);//读入a, k, p
cout << qml(a, b, p) << endl;
}
return 0;
} ```