乘法取模

 

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

 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;

posted @ 2016-10-11 19:32  张瑯小强  阅读(2212)  评论(0编辑  收藏  举报