快速乘

问题:如何求解如下所述情况时的 a*b%mod

(a、b、mod均在longlong范围内,但当a * b时会爆longlong)

一、快速乘【复杂度为O(log)】

当a*b爆longlong时,就不能直接去算了,此时可以用快速乘求解

快速乘与快速幂的思想基本一致,都是把b转化为二进制,a * b转化为多个式子相加的形式,在计算机中加法运算比乘法运算快。*

快速乘核心代码如下:

LL Quick_mul(LL a,LL b,LL mod) //LL为long long
{
    LL ans=0;
    a%=mod;
    while(b){
        if(b&1)ans=(a+ans)%mod;
        a=(a<<1)%mod; //即:a=(a+a)%mod;
        b>>=1;
    }
    return ans%c;
}

二、__int128

__int128可以装下2^128级别的大数据,不过它需要自己手写输出(但我们可以只在运算时用一下,
让a和b相乘的结果强制类型转换为__int128就行)

代码如下所示【复杂度接近O(1)】:

long long ans=((__int128)a*b)%mod;

三、快速乘【O(1)】

据说如果模数过大可能导致精度误差,故建议太大的mod不要使用这个方法。

inline LL multi(LL x,LL y,LL mod) //LL为longlong
{
    LL tmp=(x*y-(LL)((long double)x/mod*y+1.0e-8)*mod);
    return tmp<0 ? tmp+mod : tmp;
}

你可能感兴趣的:(数学)