华华你可真棒,自己要帮月月做题目,又不会写程序还想偷懒!
这题属于快速幂的模板题,但与模板不同的是数据范围更大了,1e18 的数据范围如果直接×的话会爆LL。所以除了采用快速幂外,还采用了快速乘的方法,有关快速乘的说明,可以参考下面这篇博客。
https://www.cnblogs.com/812-xiao-wen/p/10543023.html
using namespace std;
#include<bits/stdc++.h>
typedef long long LL;
LL mul(LL a,LL b,LL p){//快速乘
LL ans=0;
while(b){
if(b & 1){
ans=(ans+a)%p;
}
a=(a*2)%p;
b=b>>1;
}
return ans;
}
LL solve(LL a,LL b,LL p){//快速幂
LL ans=1;
while(b){
if(b & 1)
{
ans=mul(ans,a,p);
}
a=mul(a,a,p);
b=b>>1;
}
return ans;
}
int main(){
int t;
cin>>t;
while(t--)
{
LL a,b,p;
cin>>a>>b>>p;
cout<<solve(a%p,b,p)<<"\n";
}
return 0;
}
除了用快速乘,上面的博客中还介绍了C++中的一种非常强大的数据类型__int128,可以装下2^128级别的数据。
using namespace std;
#include<bits/stdc++.h>
typedef long long LL;
LL solve(LL a,LL b,LL p){//快速幂
LL ans=1;
while(b){
if(b & 1)
{
ans=((__int128_t)ans*a%p);
}
a=((__int128_t)a*a%p);
b=b>>1;
}
return ans;
}
int main(){
int t;
cin>>t;
while(t--)
{
LL a,b,p;
cin>>a>>b>>p;
cout<<solve(a%p,b,p)<<"\n";
}
return 0;
}