进阶组合数问题


  • C ( n , m ) C(n,m) C(n,m)当 n n n较大, m m m较小时。

如 C ( 1 0 9 , 1 0 5 ) ( m o d p ) , p > 1 0 9 C(10^9,10^5)\pmod{p},p>10^9 C(109,105)(modp),p>109

这时候不能用预处理阶乘+费马小定理做。

而是回归定义:

C ( n , m ) = n ! m ! ( n − m ) ! = ( n − m + 1 ) × ( n − m + 2 ) ⋯ × n m ! C(n,m)=\dfrac{n!}{m!(n-m)!}=\dfrac{(n-m+1)\times (n-m+2)\dots\times n}{m!} C(n,m)=m!(n−m)!n!=m!(n−m+1)×(n−m+2)⋯×n

复杂度: O ( m + l o g m ) O(m+logm) O(m+logm)

l o g m logm logm是下面的逆元,使用费马小定理即可。


当 C ( n , m ) ( m o d p ) C(n,m)\pmod p C(n,m)(modp)的 p p p较小时,不能用 k s m + ksm+ ksm+费马小定理了,因为 n ≥ p n\ge p n≥p,在计算式时我们取模 f a c [ n ] ( m o d p ) fac[n]\pmod p fac[n](modp)会变成0,导致答案不对。

所以要利用 L u c a s Lucas Lucas定理进行计算!

例题

P6870 [COCI2019-2020#5] Zapina

常规组合数学+dp

P2606 [ZJOI2010]排列计数

小顶堆+树形dp+组合数+Lucas的题,较好