题目描述
链接:https://ac.nowcoder.com/acm/contest/21763/1019
来源:牛客网
找到了心仪的小姐姐月月后,华华很高兴的和她聊着天。然而月月的作业很多,不能继续陪华华聊天了。华华为了尽快和月月继续聊天,就提出帮她做一部分作业。
月月的其中一项作业是:给定正整数A、B、P,求A^B\mod PA
B
modP的值。华华觉得这实在是毫无意义,所以决定写一个程序来做。但是华华并不会写程序,所以这个任务就交给你了。
因为月月的作业很多,所以有T组询问。
题意
求对P取模的AB( A,B,P<=1e18)
思路
- 仅用快速幂会乘法溢出,需要用快速乘实现快速幂
code
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
ll mod;
ll qmul(ll a,ll b)
{
ll ret=0;
while(b)
{
if(b&1)ret=(ret+a)%mod;
a=(a<<1)%mod;
b>>=1;
}
return ret;
}
ll qpow(ll e,ll x)
{
ll ret=1;
while(x)
{
if(x&1)ret=qmul(ret,e);
e=qmul(e,e);
x>>=1;
}
return ret;
}
void solv()
{
ll a,b;
cin>>a>>b>>mod;
cout<<qpow(a,b)<<'\n';
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T=1;
cin>>T;
while(T--)
{
solv();
}
return 0;
}
总结
- 注意数据范围,这里用快速乘处理乘法溢出
知识补充
- 用快速乘写快速幂