我是靠谱客的博主 跳跃海燕,最近开发中收集的这篇文章主要介绍进阶组合数问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

进阶组合数问题


  • 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!(nm)!n!=m!(nm+1)×(nm+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 np,在计算式时我们取模 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的题,较好

最后

以上就是跳跃海燕为你收集整理的进阶组合数问题的全部内容,希望文章能够帮你解决进阶组合数问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部