组合与计数

1.符号和基本公式

C_{m}^{n}=\frac{m!}{n!(m-n)!}

几种计算组合数取模的方法:

1.0 暴力计算,O(1)-O(m)

快速阶乘:。。。

1.1 逆元 O(mlog~{m})-O(1)

如果运用线性求逆元的手法(a^{-1}=-\frac{p}{a}*(p~mod~a)^{-1}~mod~p=(p-~\frac{p}{a})*(p~mod~a)^{-1}~mod~p

可以优化到O(m)-O(1)

1.2 模数太大的情况可以考虑Lucas定理

C_{m}^{n}=C_{m\%mod}^{n\%mod}*C_{\frac{n}{mod}}^{\frac{m}{mod}},那么复杂度就是O(mod)-O(log_{mod}(m))

 

简单计数问题:

对于数列A,S$\subset$A,求\sum_{|S|=k}|max_{S}x-min_{S}y|$$对某个数取模的值

 

约定imageimage

max和min的部分可以分开处理,实际上就是求有多少个大小为k的集合使得每个数成为最大值或最小值。

按照a_i排序,此时第i个数成为最大值的方案数为C(i-1, k-1),最小值的方案数为C(n-i, k-1)。

剩下的就是求组合数了。由于模数可能比较玄学,所以要使用crt以及快速阶乘

不简单的计数问题

询问如下多重集(数字可以重复的集合)的个数:

这个集合中有n个数字,每个数字在1..L之间,n为偶数。

这n个数字能分成n/2组,使得每组有两个数,且这两个数的积不超过c。

答案很大,对10^9+7取模。

约定:n\leq2000,L\leq2000,c\leq2000

 

很不简单的计数问题

给定n,m,求n个点m条边的无向联通图个数

http://jiaqiyang.com/2016/04/01/Counting-the-number-of-connected-graphs/

先码着

posted @ 2016-11-17 20:30  zhouyis  阅读(331)  评论(0编辑  收藏  举报