以下 p 全是素数。
Wilson:素数 p 有 (p−1)!≡−1(modp)
推论:计算 n! 所有数除去质因子 p 之后乘积 (n!)p 模 p:每 p 个分一组,散块暴力(或者预处理),整块的前 p−1 个 Wilson,最后一个全都除以 p 之后递归。
每个数和其逆元配对。仅需考虑逆元为本身即 x2≡1(modp),仅有 x=1,−1。
CRT:和拉插一样构造。x≡ai(modmi),对于每个 ai 配的系数要满足模 mi 为 1,模其它的是 0,那首先让其它的 mj 乘起来,再乘上其在模 mi 意义下的逆元,即为 ai 前面配的系数。
Legendre 公式:p 在 n! 中次幂为 vp(n!)=∑⌊npi⌋=n−Sp(n)p−1,这里 Sp(n) 是 p 进制数位和。
直接考虑所有 p 的倍数,全都除以 p 之后递归。由此归纳。
Kummer 定理:vp((nm))=Sp(m)+Sp(n−m)−Sp(n)p−1。常用推论:多重组合数模 2 当且仅当下标们二进制下两两不交。
Wilson 定理的推广:
(pq!)p≡{1,(p=2)∧(q≥3),−1,otherwise.
考虑配对。解 x2≡1(modpq)。pq=2 时只有 1,p=2,q≥3 时有 ±1,2q−1±1,其余情况仅有 ±1。
现在和上文中同理,也能计算 (n!)pmodpq 了,按 p 分组,按 pq 分块。散块暴力,整块直接套用 Wilson 的推广,每组最后一个数单独拉出来,统一除以 p 以后递归算。
Lucas:(nm)≡(⌊n/p⌋⌊m/p⌋)(nmodpmmodp)(modp)
对于多项式 f(x) 满足 fp(x)≡f(xp)(modp)。
欲求 (nm)=[xm](1+x)n=[xm](1+x)p⋅[n/p](1+x)nmodp=(1+xp)[n/p](1+x)nmodp.
而前者仅在 p 的次幂处有取值,后者次数 <p,那么前者只能取 p[m/p] 这一项,后者只能取 mmodp。即得 Lucas 定理。
exLucas:
先将模数分解为 ∏paii,对每个 paii 求答案然后 CRT 合并出来。现在问题就是求 (nm)(modpa),用 Kummer 算 p 上的指数是多少,Wilson 推论算所有数除去 p 因子之后的乘积就行。
教练,我还想学这个 https://oi-wiki.org/math/number-theory/congruence-equation/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?