版权声明:转载请注明出处: https://blog.csdn.net/weixin_43871781/article/details/87255181
在计算a*b mod p过程中a*b通常爆精度,所以需要处理一下。
(一)对于a*b,看作b个a,进行(a+a) mod p,但复杂度O(b)太大,b通常是10¹⁸以上。
(二)模仿快速幂。
ll rpow(ll a,ll b,ll p)
{
ll ans=0;
while(b)
{
if(b&1)ans=(ans+a)%p;
a=(a<<1)%p;b>>=1;
}
return ans%p;
}
int main()
{
ll a,b,p;
while(~scanf("%lld%lld%lld",&a,&b,&p))
{
ll ans=rpow(a%p,b%p,p);
printf("%lld\n",ans);
}
return 0;
}
(三)???
int main()
{
ll a,b,p;
while(~scanf("%lld%lld%lld",&a,&b,&p))
{
a%=p;b%=p;
ll c=a*(long double)b/p;
ll ans=a*b-c*p;
if(ans<0)ans+=p;
else if(ans>=p)
ans-=p;
printf("%lld\n",ans);
}
return 0;
}