快速乘

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

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

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

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

 1ll fastMultiplication(ll a,ll b,ll mod){
 2    ll ans = 0;
 3    while(b){
 4        if(b%2==1){
 5            b--; 
 6            ans = ans + a;
 7                        ans %= mod;
 8        }else{
 9                        b /= 2;
10            a = a + a;
11                        a %= mod;
12        }
13    }
14    return ans;
15}

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

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