快速乘 防爆乘 快速幂

快速幂模板:

typedef long long LL;

LL fast_pow(LL a, LL n, LL mod)//快速幂 
{
    LL ans = 1;
    while (n)
    {
        if (n & 1)
            ans = ans*a%mod;
        a = a*a%mod;
        n >>= 1;
    }
    return ans;
}

如果你是按照二进制来理解快速幂的 那么快速乘也一定很好理解

模板如下:

LL fast_multi(LL m, LL n, LL mod)//快速乘法 
{
    LL ans = 0;//注意初始化是0,不是1 
    while (n)
    {
        if (n & 1)
           {
             ans += m;
             ans %= mod;
           }
        m = (m + m) % mod;//和快速幂一样,只不过这里是加 
        n >>= 1;
    }
    return ans;
}            

有了快速乘 那么就可以得到改进后的快速幂 可以防爆

LL fast_pow(LL a, LL n, LL mod)//快速幂 
{
    LL ans = 1;
    while (n)
    {
        if (n & 1)
            ans = fast_multi(ans, a, mod);//不能直接乘 
        a = fast_multi(a, a, mod);
        ans %= mod;
        a %= mod;
        n >>= 1;
    }
    return ans;
}

防爆乘一并放出:

LL mult_mod(LL a, LL b, LL m)
{
    ll c = a*b-(ll)((long double)a*b/m+0.5)*m;
    return c<0 ? c+m : c;  //就是算的a*b%m;
}

猜你喜欢

转载自www.cnblogs.com/dyhaohaoxuexi/p/10977130.html