概述
进阶组合数问题
- 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)dotstimes 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 nge 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的题,较好
最后
以上就是跳跃海燕为你收集整理的进阶组合数问题的全部内容,希望文章能够帮你解决进阶组合数问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复