zoukankan      html  css  js  c++  java
  • [模板] 快速乘 O(1)乘法 解决模运算下整数乘法64位变量溢出问题

    快速乘原理同快速幂

    不做赘述

    ll qmul(ll a, ll b, ll mod) //快速乘
    {
        ll ans = 0;
     
        while(b)
        {
            if(b & 1)
                ans = (ans + a) % mod;
            a = (a + a) % mod;
            b >>= 1;
        }
    
        return ans;
    }
    
     
    ll qpow(ll a, ll b, ll mod) //快速幂
    {
        ll ret = 1;
     
        a %= mod;
     
        while(b)
        {
            if(b & 1)
                ret = mul(ret, a, mod) % mod;
            a = mul(a, a, mod), mod;
     
            b >>= 1;
        }
     
        return ret;
    }
     

    方法2 

    将模运算全部转换为加减法运算, 即使爆数据也不会造成%模运算错误

    a * b % p = a * b - floor(a / p * b) * p;

    ll qmul_db(ll a, ll b, ll mod)
    {
        ll cnt = ld(a) * b / mod;
    
        ll ans = a * b - cnt * mod;
    
        if(ans < 0)
            ans += mod;
        else if( ans > mod)
            ans -= mod;
        return ans;
    }
    
  • 相关阅读:
    团队站立会议09
    团队站立会议08
    团队绩效
    团队站立会议07
    团队站立会议06
    团队站立会议05
    团队站立会议04
    团队站立会议03
    团队站立会议02
    反转链表
  • 原文地址:https://www.cnblogs.com/zeolim/p/12270400.html
Copyright © 2011-2022 走看看