• 快速乘 防爆乘 快速幂


    快速幂模板:

    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;
    }
  • 相关阅读:
    mybatis
    Spring原理
    JS 之继承
    HTTP协议简介2
    JS 之原型,实例,构造函数之间的关系
    HTTP协议简介1
    freemarker语法简介
    CSS 动画之十-图片+图片信息展示
    JS实现颜色值的转换
    抓包工具charles的使用
  • 原文地址:https://www.cnblogs.com/dyhaohaoxuexi/p/10977130.html
Copyright © 2020-2023  润新知