模运算的世界
算法竞赛中的取模运算
在算法竞赛中,为了防止溢出和确保结果在合理范围内,通常使用取模运算。常见的模数是 $ = 1,000,000,007 $(一个大质数)。下面是一些常用的取模操作及其示例:
1 | const int MOD = 1'000'000'007; |
详细解释
加法
\((a + b) \% \text{MOD}\)
将两个数相加后取模。
减法
\((a - b + \text{MOD}) \% \text{MOD}\)
先进行减法运算,再加上 MOD 防止出现负数,最后取模。
取模到 [0, MOD-1]
\((a \% \text{MOD} + \text{MOD}) \% \text{MOD}\)
无论 a 是正数还是负数,结果都被规范到 [0, \(\text{MOD}-1\)] 的范围内。
乘法
\(a \times b \% \text{MOD}\)
将两个数相乘后取模。需要注意的是为了防止溢出,通常在 C++ 中用
1LL * a * b
将运算提升到长整型。多个数相乘
\(a \times b \% \text{MOD} \times c \% \text{MOD}\)
逐步取模,防止中间结果溢出。
快速幂
\(\text{qpow}(a, b, \text{MOD})\)
快速幂算法用于计算 \(a^b \% \text{MOD}\) ,时间复杂度为 \(O(\log b)\) 。
除法
\(a \times \text{qpow}(b, \text{MOD} - 2, \text{MOD}) \% \text{MOD}\)
当 MOD 是质数时,利用费马小定理 $ b^{-1} ( )$ ,求出 $b^{-1} b^{-2} ( ) $,从而实现除法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Totoroの旅!
评论