组合数
初始化
我们知道阶乘的定义: (i+1)! = i! * (i+1)
现在,我们对这个等式的两边同时取模逆元。根据模逆元的性质 inv(a * b) = inv(a) * inv(b) (mod p),我们得到: inv((i+1)!) = inv(i!) * inv(i+1)
我们的目标是求 inv(i!)。所以,我们把上面的等式变形,两边同时乘以 (i+1): inv((i+1)!) * (i+1) = inv(i!) * inv(i+1) * (i+1)
因为一个数乘以它自己的逆元等于 1(inv(x) * x ≡ 1 (mod p)),所以等式右边的 inv(i+1) * (i+1) 就等于 1。
于是我们得到了最终的关键递推关系:
inv(i!) = inv((i+1)!) * (i+1)
这个公式告诉我们:如果我们知道了 inv((i+1)!),我们就可以用一次乘法 O(1) 的时间复杂度计算出 inv(i!)。
1 | const int MAXN = 355; |
- 标题: 组合数
- 作者: InfinityKI
- 创建于 : 2025-08-17 08:18:52
- 更新于 : 2025-08-17 19:26:23
- 链接: http://infinityki.github.io/2025/08/17/组合数/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论