mod 1000000007 到底是个啥?-野牛程序员讲少儿编程
🌟「mod 1000000007」到底是个啥?
在写算法题、信息学竞赛、甚至刷 LeetCode 时,经常看到下面这种代码:
const int MOD = 1000000007; result = (a + b) % MOD;
这时候很多小朋友都问:
👉 “为什么结果还要对个一十亿零七取模?这数字是干嘛的?”
👉 “为啥老是 1000000007,不能是 8888 吗?”
来,讲清楚 👇
🧠 mod 是什么?
mod
叫做“取模”或“取余数”。
意思就是:只保留除法的余数,不要整数部分。
比如:
7 % 3 = 1
,因为 7 ÷ 3 = 2 余 110 % 4 = 2
那么 a % 1000000007
就是把 a
除以 1000000007,结果只要余数部分。
💡 为什么要取模?
👶 原因一:防止“爆炸”!
程序中经常会算非常非常大的数,比如:
2^1000、n!(阶乘)、数列累加几亿次
这些结果会远远超出 int/long long 的表示范围。
🧯 所以就像加“保险”一样,取模能把数限制在一个合理的范围里(最多不超过 1000000006),不容易爆掉。
🎯 为什么是 1000000007?
这个数字不是随便编的,它有三大“隐藏属性”👇
✅ 1. 它是一个质数(素数)!
质数就是只能被 1 和自己整除的数,比如 2、3、5、7、11……1000000007
是一个特别大的质数。
为什么要用质数?
因为在很多算法中,比如快速幂取逆元、费马小定理、组合数取模公式里,模数是质数可以让我们更容易使用数学公式!
比如组合数 C(n,k)mod p,模数必须是质数才能用逆元。
✅ 2. 它刚好小于 2312^{31}231
这点对 C++ 里的 int
类型非常友好!
int
最大值是:
2^31 - 1 = 2147483647
而 1000000007 < 2147483647
,能稳稳放进 int 里,不会爆炸。
所以很多题目和 OJ 平台都喜欢用它当模数。
✅ 3. 写起来顺手!
1000000007 是 10 后面 7 个 0 加一个 7,记起来非常顺,键盘上一敲就能打出来。
🎨 形象比喻时间:
想象一个大水杯装水,程序中数字越算越大,水就越多。
不给它一个模数限制,它迟早会溢出来把程序淹了!
而 mod 1000000007
就像是一个“限高杆”,让水始终控制在一个合理范围内。
🧪 举个例子:
int a = 1000000006; int b = 2; int result = (a + b) % 1000000007; cout << result; // 输出 1
1000000006 + 2 = 1000000008
取模后就是 1(因为刚好多出一个 1000000007)
🔚 总结下:
名称 | 含义与作用 |
---|---|
mod | 取余,防止整数过大 |
1000000007 | 常用大质数,方便公式计算与程序安全 |
为什么选它? | 是质数、安全、int 不爆、好记好打 |
应用场景 | 快速幂、组合数、动态规划、斐波那契、dp 计数问题…… |
