快速乘

16年北京网络赛遇到了这个技巧...但是竟然忘记记了下来?

快速乘是为了解决 计算a_b % mod 时a_b溢出LL 的问题

比如a=1E16,b=1E16,mod=1E18,虽然最后的结果没有溢出,但是中间溢出了。

原理和快速幂很类似,具体可以参考 晴川大爷的专栏

ll fastMultiplication(ll a,ll b,ll mod){
    ll ans = 0;
    while(b){
        if(b%2==1){
            b--; 
            ans = ans + a;
                        ans %= mod;
        }else{
                        b /= 2;
            a = a + a;
                        a %= mod;
        }
    }
    return ans;
}

完全就是把快速幂中的乘法变成加法了嘛(从记忆角度考虑orz

inline long long multi(long long x,long long y,long long mod)  
{  
long long tmp=(x*y-(long long)((long double)x/mod*y+1.0e-8)*mod);  
return tmp<0 ? tmp+mod : tmp;  
}