本题考察快速幂算法和快速乘算法,快速幂算法可以正着进行也可以反着进行,在这里采用正着进行倍增的思路。
以2^10为例,其中指数10可以变成二进制1010,也就可以变成2^(2^3)+2^(2^1)。2的出现也就意味着可以使用倍增的思路去求解。
也就是将指数变成二进制进行挨个计算,在计算过程中维护temp的倍增。这样如果当前二进制位等于1的时候可以直接乘于temp。
另外在本题当中由于在相乘的过程中会超出long long的范围,所以还需要使用快速乘算法,将乘法变成多个加法。使用递归去实现。
代码:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll fast_multiply(ll a, ll b, ll p) {
if (b==0) {
return 0;
}
if (b==1) {
return a%p;
}
ll ans = 0;
if (b&1) {
ans = (ans%p+a%p)%p;
b--;
}
ll num = fast_multiply(a, b/2, p);
ans = (ans%p+num%p+num%p)%p;
return ans;
}
ll fast_mi(ll a, ll b, ll p) {
ll temp = a;
ll ans = 1;
while (b) {
if (b&1) ans = fast_multiply(ans, temp, p);
temp = fast_multiply(temp, temp, p);
b = (b>>1);
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T;
cin>>T;
ll a,b,p;
while (T--) {
cin>>a>>b>>p;
cout<<fast_mi(a, b, p)<<endl;
}
return 0;
}

京公网安备 11010502036488号