「mod 1000000007」到底是个啥?
在写算法题、信息学竞赛、甚至刷 LeetCode 时,经常看到下面这种代码:
这时候很多小朋友都问:
“为什么结果还要对个一十亿零七取模?这数字是干嘛的?”
“为啥老是 1000000007,不能是 8888 吗?”
来,讲清楚
🧠 mod 是什么?
mod叫做“取模”或“取余数”。
意思就是:只保留除法的余数,不要整数部分。
比如:
7 % 3 = 1,因为 7 ÷ 3 = 2 余 1
10 % 4 = 2
那么a % 1000000007就是把a除以 1000000007,结果只要余数部分。
为什么要取模?
原因一:防止“爆炸”!
程序中经常会算非常非常大的数,比如:
这些结果会远远超出 int/long long 的表示范围。
🧯 所以就像加“保险”一样,取模能把数限制在一个合理的范围里(最多不超过 1000000006),不容易爆掉。
为什么是 1000000007?
这个数字不是随便编的,它有三大“隐藏属性”
1. 它是一个质数(素数)!
质数就是只能被 1 和自己整除的数,比如 2、3、5、7、11……
1000000007是一个特别大的质数。
为什么要用质数?
因为在很多算法中,比如快速幂取逆元、费马小定理、组合数取模公式里,模数是质数可以让我们更容易使用数学公式!
比如组合数 C(n,k)mod p,模数必须是质数才能用逆元。
2. 它刚好小于 2^31
这点对 C++ 里的int类型非常友好!
int最大值是:
而1000000007 < 2147483647,能稳稳放进 int 里,不会爆炸。
所以很多题目和 OJ 平台都喜欢用它当模数。
3. 写起来顺手!
1000000007 是10 后面 7 个 0 加一个 7,记起来非常顺,键盘上一敲就能打出来。
形象比喻时间:
想象一个大水杯装水,程序中数字越算越大,水就越多。
不给它一个模数限制,它迟早会溢出来把程序淹了!
而mod 1000000007就像是一个“限高杆”,让水始终控制在一个合理范围内。
🧪 举个例子:
1000000006 + 2 = 1000000008
取模后就是 1(因为刚好多出一个 1000000007)
总结下:
野牛程序员教少儿编程与信息学奥赛
宜宾市野牛网络科技有限公司专业微信小程序开发、网站建设、软件开发等