快速乘

快速乘

参考:小技巧1——长整型:64位整数的乘法模运算

当 a 和 b 都大于1e9的时候,为了防止溢出,就需要一个算法,叫做快速乘。

实现方法一:

将乘法转换为加法,并且伴随着取模操作的进行,可以保证不会溢出。

而为了加速加法操作,可以利用快速幂的思路,对加法操作进行优化,复杂度为\(O(log_2 b)\)

ll qmul(ll a,ll b,ll mod){
    ll ans=0;
    while(b){
        if(b&1) ans=(ans+a)%mod;
        a=(a<<1)%mod,b>>=1;
    }
    return ans;
}

实现方法二:

\(O(1)\)复杂度

ll qmul(ll a,ll b,ll mod){
    ll c=a*(long double)b/mod;
    ll ans=a*b-c*mod;
    ans=(ans+mod)%mod;
    return ans;
}
posted @ 2020-02-22 16:13  caoanda  阅读(222)  评论(0编辑  收藏  举报