用C++写的快速幂的模板
(a * b) % p = (a % p * b % p) % p (取模运算的运算法则)
原理:例如4的5次方,执行5次循环,时间复杂度很高,我们可以将5转换为二进制101,
1*2^0+0*2^1+1*2^2,这些是4的指数,由于二进制中为0的项变成了4^0=1,与原来结果不变。
故位运算跳过计算,则这个数由原来循环5次到最终2个数相乘得到答案,大大节约了时间成本
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;//直接用ll代替long long的定义了
int qmi(int a,int k,int p)
{
int res=1;
while(k){
if(k&1)res=(ll)res*a%p;
k>>=1; //表示把k转换成二进制在向右移一位
a=(ll)a*a%p;
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
while(n--){
int a,k,p;
scanf("%d%d%d",&a,&k,&p);
printf("%d\n",qmi(a,k,p));
}
return 0;
}