[数论](a % MOD + b % MOD) % MOD = (a + b) % MOD
这个等式成立是因为模运算的加法性质,即模运算在加法操作下具有分配性。我们可以从数学上证明这个等式:
证明:
设 a
和 b
是任意整数,MOD
是一个正整数。我们需要证明:
(a % MOD + b % MOD) % MOD=(a+b) % MOD
步骤 1:定义余数
我们可以将 a
和 b
表示为:
a=q1⋅MOD+r1(其中 0≤r1<MOD)
b=q2⋅MOD+r2(其中 0≤r2<MOD)
其中:
r1 = a % MOD
(a
对MOD
取余的结果)r2 = b % MOD
(b
对MOD
取余的结果)
步骤 2:计算 (a % MOD + b % MOD) % MOD
a % MOD+b % MOD=r1+r2
如果 r1 + r2 < MOD
,那么:
(r1+r2) % MOD=r1+r2
如果 r1 + r2 >= MOD
,那么:
(r1+r2) % MOD=(r1+r2)−MOD*n
步骤 3:计算 (a + b) % MOD
a+b=(q1⋅MOD+r1)+(q2⋅MOD+r2)=(q1+q2)⋅MOD+(r1+r2)
因此:
(a+b) % MOD=(r1+r2) = (r1+r2) % MOD
步骤 4:比较两者
(a % MOD+b % MOD) % MOD=(r1+r2) % MOD
(a+b) % MOD=(r1+r2) % MOD
所以:
(a % MOD+b % MOD) % MOD=(a+b) % MOD
直观理解
a % MOD
表示a
去掉尽可能多的MOD
后剩下的部分(即a
在[0, MOD-1]
范围内)。b % MOD
同理。- 它们的和
(a % MOD + b % MOD)
可能超过MOD
,所以需要再取一次模,确保结果在[0, MOD-1]
范围内。 - 而
(a + b) % MOD
也是去掉a + b
中所有的MOD
后剩下的部分,所以两者等价。
为什么这个性质在算法中很重要?
在算法竞赛和大数计算中,我们经常需要对大数取模,以避免数值溢出(如 C++
的 int
溢出)或提高计算效率(如 Python 的大数计算较慢)。
这个性质允许我们:
- 先对部分结果取模,再相加,最后再取模,而不会影响最终结果。
- 减少中间计算过程的数值大小,防止溢出或降低计算复杂度。
示例
假设 MOD = 7
,a = 10
,b = 8
:
a % MOD=10 % 7=3b % MOD=8 % 7=1(3+1) % 7=4 % 7=4(10+8) % 7=18 % 7=4
两者结果相同,验证了等式成立。
总结
这个等式成立是因为模运算在加法操作下具有分配性,允许我们先取模再相加,而不会影响最终结果。这在算法优化中非常有用,可以避免大数计算并提高效率。