对于 组合数 取模的各种情况

1、当 \(n,m\le1000\)\(p\) 为任意数时

可以使用暴力(\(\text{O}(n^2)\))求解 杨辉三角 的方式,计算

\[\binom{n}{m} = \binom{n-1}{m-1}\sdot\binom{n-1}{m} \]


2、当 \(n,m\le 10^6\)\(p\approx 10^9\)\(p\) 为素数时

利用公式

\[\binom{n}{m} =\dfrac{n!}{m!(n-m)!}\bmod p \]

\(\text O(n)\) 预处理阶乘,然后求逆元。


3、当 \(n\le 10^6\)\(m\le 1000\)\(p\) 为任意数时

\[\binom{n}{m} =\dfrac{n!}{m!(n-m)!}=\dfrac{n\times(n-1)\times\dots(n-m+1)}{1\times 2\times 3\times \dots\times m} \]

因为组合数一定为整数,然后可以尝试约分,得到

\[\binom{n}{m} = x_1\times x_2\times x_3\times\dots\times x_m \]


4、当 \(n,m\le 10^9\)\(p\le 1000\)\(p\) 为素数时

因为 \(p\) 的范围较小,且 \(p\) 为素数,考虑 Lucas定理 求解,

\[\binom{n}{m}\bmod p= \binom{\left\lfloor n/p\right\rfloor}{\left\lfloor m/p\right\rfloor}\cdot\binom{n\bmod p}{m\bmod p}\bmod p \]

posted @ 2023-01-13 09:04  Ciaxin  阅读(27)  评论(0编辑  收藏  举报