64位整数的乘法模运算

版权声明:转载请注明出处: 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43871781/article/details/87255181
今日推荐