当我们求一些类似于a^k%p这些题目时,在求a^k时,如果使用暴力的算法,那么显而易见,要进行k次循环。因此快速幂就应运而生了,它只需要logk的复杂度。
其实它的核心思想就是将k转换成二进制,从而简化计算。例如求a^5时,5可以化为101,因此就可以变成a^2^0*a^2^2,由原来的5步转换为2步,大大简化了计算。下面我贴上我的代码。
#include "iostream"
#include "algorithm"
using namespace std;
typedef long long LL;
int qmi(int a, int k, int p){
int res = 1;
while(k){
if(k & 1)res = (LL)res * a % p;
k >>= 1;
a = (LL)a * a % p;
}
return res;
}
int main(){
int n, a, k, p;
cin >> n;
while(n--){
scanf("%d %d %d", &a, &k, &p);
printf("%d", qmi(a,k,p));
}
return 0;
}