当我要计算两个数相乘后取模的结果时,可以这样写:
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;