在素数模数下运算
进行加法和乘法并保持在模数范围内
在素数模数下运算 是 CoddyKit 上的免费 Coding Interview Prep 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Coding Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Coding Interview Prep 课程共包含 4 节课。
为什么要取模
竞赛题的答案可能变得极其庞大,远远超出其他地方使用的整数类型。因此,题目通常要求对一个大质数取模,以便让数字保持较小。🔢
认识著名的模数
您最常见到的质数是1000000007,通常写作 1e9+7。它足够大,可以避免冲突;又足够小,能够放入 64 位整数。
MOD = 1000000007取模的含义
取模运算符会给出除法后的余数。因此,17 % 5 等于 2,因为 17 除以 5 后余数为 2。
print(17 % 5) # 2加法也保持在范围内
您可以先相加,最后再取模;也可以在计算过程中不断取模。无论采用哪种方式,余数都相同,因此应经常进行约减以保持数值较小。
total = (a + b) % MOD乘法也同样如此
乘法也遵循同样的规则:将乘积对该质数取模。Python 原生支持大整数,但取模可以让每个值都保持很小,从而提高速度。
prod = (a * b) % MOD每一步之后都进行约减
在较长的循环中,每次迭代都应用% MOD。这样可以防止数字不断膨胀,并让每次运算都保持廉价且可预测。
ans = (ans * i) % MOD减法可能得到负数
减法在许多语言中可能产生负余数。在最后取模之前加回 MOD,就能让结果落在安全的非负范围内。
diff = (a - b + MOD) % MODPython 中友好的取模行为
好消息是:当模数为正时,Python 的%运算已经会返回非负结果。因此 -1 % 7 得到 6,而不是 -1,您无需额外修正。
print(-1 % 7) # 6取模可以分配到运算中
核心思想是:对于加法和乘法,(a op b) % m 等于 (a%m op b%m) % m。因此,您可以在合并输入之前先对它们进行约减。
除法是个例外
加法、减法和乘法都能在模运算下正常进行,但普通除法不行。本课程稍后会介绍如何使用模逆元来完成除法。
在顶部设置一次 MOD
在解答开头将MOD定义为常量。使用一个命名值,比在代码中到处散落 1000000007 更好,也能避免拼写错误藏在其中。
MOD = 10**9 + 7快速检查
为什么要在对减法结果取模之前加上 MOD?
回顾
现在您可以使用 1e9+7 这样的素数模数,让庞大的计数保持较小。在每一步都对加法、减法和乘法进行约减,注意处理负数,并将除法留给逆元。🎯
常见问题解答
「在素数模数下运算」课时是免费的吗?
是的 — 「在素数模数下运算」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Coding Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 Coding Interview Prep 课程共包含 4 节课。
「在素数模数下运算」这节课中我会学到什么?
进行加法和乘法并保持在模数范围内 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Coding Interview Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Coding Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「在素数模数下运算」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Coding Interview Prep 课中编写并运行代码吗?
能。每节 Coding Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 在素数模数下运算
- 快速模幂运算
- 使用费马定理求模逆元
- 使用预计算阶乘计算 nCr