模板题,记住算了...想的有点晕
前言:首先要知道(a * b)%p==(a%p)*(b%p)%p;
因为这一题普通乘法用ull会超范围,只能用int128,但是int128要手写输入输出,所以还是用快速幂,快(慢)速乘算了
思路:如3^^5==3^^(0101)==3^^(2^^2+2^^0);然后每次都计算下一次
AC代码:
#include<iostream>
using namespace std;
#define ull unsigned long long
ull p;
ull quick_mul(ull a,ull b)//实现了a*b%p
{
ull ans=0;
while(b)
{
if(b&1)
{
ans=(ans+a)%p;
}
a=(a+a)%p;//a+a即(a*2)%p
b>>=1;
}
return ans;
}
ull quick_pow(ull a,ull b)
{
ull ans=1;
while(b)
{
if(b&1)
{
ans=quick_mul(ans,a);//第一次就是1*a%p
}
a=quick_mul(a, a);//提前计算好下次的(a*b)%p中的a*p
b>>=1;
}
return ans;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);
int t;cin>>t;
ull a,b;//千万别在这里再定义一次p,不然输入的就不是全局变量p了
while(t--)
{
cin>>a>>b>>p;
cout<<quick_pow(a,b)<<'\n';
}
return 0;
}