当前位置 博文首页 > ronwhite的博客:慢速乘法和快速幂

    ronwhite的博客:慢速乘法和快速幂

    作者:[db:作者] 时间:2021-09-04 09:17

    两者都用了二进制的性质,慢速乘法避免了乘法爆long long
    快速幂加速乘方运算;

    快速幂

    LL fast_pow(LL a,LL k,LL mo)
    {
        long long ans=1;
        for(;k;k>>=1,a=a*a%mo)
            if(k&1) ans=ans*a%mo;
        return ans;
    }
     while(k)
        {
            if(k&1) ans=ans*a%mo;
            a=(a*a)%mo;
            k>>=1;
        }

    一个数的n次幂等于n的二进制次幂的乘积

    such as k^7=k^1 k^2 K^4;
    所以快速幂就是通过乘法处理出k的2进制c次幂;以加速幂运算
    复杂度log

    慢速乘法

    原理同为二进制,把其中一个乘数,拆成二进制的和,分别与另一个乘数相乘,并取模

    LL low_c(LL a,LL b){
        LL ans=0;
        while(b)
        {
            if(b&1)
            {
                b--;
                ans=(ans+a)%mo;
            }
            b>>=1;
            a=(a<<1)%mo;//此处乘2,以弥补b左移一位的损失
        }
        return ans;
    }

    另有一种神奇写法

    LL low_c1(LL a,LL b)
    {
        LL tmp=a*b-mo*(LL)((long double)a*b/mo);
        if (tmp<0) tmp+=mo;
        return tmp;
    }
    cs
    下一篇:没有了