乘法取模

当我要计算两个数相乘后取模的结果时,可以这样写:

 1 typedef long long LL;
 2 
 3 LL multi(LL a, LL b, LL mo){
 4     LL ans = 0;
 5     while(b){
 6         if(b & 1){
 7             ans += a;
 8             if(ans >= mo){
 9                 ans -= mo;
10             }
11         }
12         a <<= 1;
13         if(a >= mo){
14             a -= mo;
15             if(a == 0) return ans;
16         }
17         b >>= 1;
18     }
19     return ans;
20 } 

这样可以防止中间过程溢出,但速度可能不是辣么快。

要注意的是,得保证a、b都小于mo。如果不能保证,请先a%=mo, b%=mo;

原文地址:https://www.cnblogs.com/CsOH/p/5950491.html