原题链接:
题解:
快速幂的基本思想是利用幂的指数分解,将指数逐步减半,减小计算量,从而提高计算效率。
具体步骤如下:
将幂的指数表示为二进制形式。例如,对于指数
b = 13
,其二进制表示为1101
。将指数的二进制形式从右向左逐位遍历。每次遇到一个二进制位为 1 的位置,就累乘当前的底数。
在遍历过程中,每次将底数平方,即
a * a
。每遍历一位二进制位,指数减半。
例如:
11的二进制是1011
时间复杂度分析:
假如我们现在要计算a的b次方,暴力做法需要进行b次乘运算,时间复杂度为O(b);
快速幂时间复杂度为O(logb).
代码:
#include<bits/stdc++.h>
using namespace std;
using ULL = unsigned long long;
int n;
ULL qmi(ULL a, ULL b, ULL p) {
ULL res = 1;
while (b) {
if (b & 1) res = res * a % p;
b >>= 1;
a = a * a % p;
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
while (n--) {
ULL a, b, p;cin >> a >> b >> p;
cout << qmi(a, b, p) << endl;
}
}