求组合数 (
) 需要用到公式
=
=
,
所以我们可以用阶乘来计算组合数,对于 中的
和
还需要用到逆元的知识,具体代码如下,应用时只需要修改MOD 和 MX即可
MOD = 1_000_000_007
MX = 100_001 # 根据题目数据范围修改
fac = [0] * MX # fac[i] = i!
fac[0] = 1 # 0! = 1
# 预处理阶乘
for i in range(1, MX):
fac[i] = fac[i - 1] * i % MOD
# 预处理阶乘逆元
inv_f = [0] * MX # inv_f[i] = i!^-1
inv_f[-1] = pow(fac[-1], -1, MOD)
for i in range(MX - 1, 0, -1):
inv_f[i - 1] = inv_f[i] * i % MOD
# 计算组合数
def comb(n: int, m: int) -> int:
return fac[n] * inv_f[m] * inv_f[n - m] % MOD if 0 <= m <= n else 0