1. 程式人生 > >快速乘法模板

快速乘法模板

快速乘法使用二進位制將乘法轉化為加法,既加快可以加快運算速度,又可以防止直接相乘之後溢位

簡單的寫法:

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

更快更高效的寫法:

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

利用快速乘法優化的快速冪:

ll mul(ll a,ll b,ll mod)
{
    a%=mod;
    b%=mod;
    ll res=0;
    while(b){
        if(b&1){
        //printf("%lld %lld %lld\n",a,b,res);
            res+=a;
            if(res>=mod)
                res-=mod;
        }
        b>>=1;
        a<<=1;
        if(a>=mod)  a-=mod;
    }
    return res;
}
ll quickPow(ll a,ll b,ll m)
{
    ll res=1;
    while(b){
        if(b&1)
        res=mul(res,a,m);
        a=mul(a,a,m);
        b>>=1;
    }
    return res;
}