组合数
基本计算方式:
$${n choose m}={n-1 choose m} + {n-1 choose m-1}=frac{n!}{m!(n-m)!}=frac{n^{underline{m}}}{m!}$$
与组合数的行相关的公式:
$${n choose m}=sumlimits_{i=0}^{n-1} {i choose m-1}$$
与组合数的斜线相关的公式:
$${n choose m}=sumlimits_{i=0}^{m}{n-m-1+i choose i}$$
Lucas定理:
$${n choose m}={lfloor frac{n}{p} floor choose lfloor frac{m}{p} floor}{n mod p choose m mod p} mod p$$
可以形象的视作将$n$和$m$拆成$p$进制后,每个对应数位的组合数相乘的结果。
二项式反演:
$$a_i=sumlimits_{j=0}^i{i choose j}b_j$$
$$b_i=sumlimits_{j=0}i(-1){i-j}{i choose j}a_j$$
广义容斥原理:
$$a_i=sumlimits_{j=i}^n{j choose i}b_j$$
$$b_i=sumlimits_{j=i}n(-1){j-i}{j choose i}a_j$$
斯特林数
基本计算方式:
$$egin{bmatrix}n \ m end{bmatrix}=egin{bmatrix}n-1 \ m-1 end{bmatrix}+(n-1)egin{bmatrix}n-1 \ m end{bmatrix}$$
$${n race m}={n-1 race m-1}+m{n-1 race m}$$
第一类斯特林数的单行求法
根据第一类斯特林数是上升阶乘幂展开式的系数,有
$$sum_{i=0}^n egin{bmatrix} n \ m end{bmatrix}xi=prod_{i=0}{n-1}(x+i)$$
于是可以分治$FFT$求出一行。
第二类斯特林数的直接展开式:
$${n race m}=frac{1}{m!}sumlimits_{k=0}{m}(-1){m-k}{m choose k}k^n$$
上式可以转化成可以$FFT$的形式:
$${n race m}=sumlimits_{k=0}^m frac{(-1)^{m-k}}{(m-k)!} frac{k^n}{k!}$$
下降幂、通常幂与上升幂之间的转化:
$$xn=sumlimits_{k=0}{n}{n race k}x{underline{k}}=sumlimits_{k=0}{n}(-1)^{n-k}{n race k}x^{overline{k}}$$
$$x{overline{n}}=sumlimits_{k=0}{n}egin{bmatrix} n \ k end{bmatrix}x^k$$
$$x{underline{n}}=sumlimits_{k=0}{n}(-1)^{n-k}egin{bmatrix} n \ k end{bmatrix}x^k$$
把幂换成某些奇妙的函数,就得到了传说中的斯特林反演......
一些图计数相关
有标号无向连通图:
设答案为$f_n$,那么考虑容斥所有不合法方案,即不联通的方案。
于是,枚举$1$节点所在的联通块:
$$f_n=2^{n choose 2}-sumlimits_{i=1}^{n-1}{n-1 choose i-1}2^{n-i choose 2}f_i$$
于是可以分治FFT。$O(nlog^2)$.
或者,继续化简这个式子:
$$f_n = 2^{n choose 2}-sumlimits_{i=1}{n-1}frac{(n-1)!}{(i-1)!(n-i)!}2{n-i choose 2}f_i $$
$$frac{f_n}{(n-1)!} = frac{2^{n choose 2}}{(n-1)!}-sumlimits_{i=1}{n-1}frac{f_i}{(i-1)!}frac{2{n-i choose 2}}{(n-i)!}$$ $$frac{2^{n choose 2}}{(n-1)!} = sumlimits_{i=1}{n}frac{f_i}{(i-1)!}frac{2{n-i choose 2}}{(n-i)!}$$
于是令$G(x)=sumfrac{f_i}{(i-1)!}$,$C(x)=sumfrac{2^{i choose 2}}{i!}$,$F(x)=sumfrac{2^{i choose 2}}{(i-1)!}$,那么有
$$F(x)=G(x)*C(x)$$
于是可以多项式求逆。$O(nlogn)$.
或者,认为无向连通图是无向图的一个划分,即一个无向图可以表示成若干个无向连通图。
于是令$C(x)$为无向连通图个数的生成函数,$G(x)$为连通图个数的生成函数,则有如下关系:
$$G(x)=e^{C(x)}$$
也就是说
$$C(x)=ln G(x)$$
于是可以多项式求$ln$。$O(nlogn)$。
欧拉回路图计数
存在欧拉回路的条件为联通且点度数均为偶数。
由于最后一个点可以任意连边使得度数条件满足均为偶数,那么有度数为偶数的图的方案数$F_n=2^{n-1 choose 2}$。
于是可以使用求解无向连通图个数的任意方法进行求解。
有标号DAG(有向无环图)计数
令答案为$f_n$,考虑枚举度数为$0$的节点的数量。
由于无法保证递推下去的$f_{n-i}$中有多少个度数为$0$的点,因此加入一个容斥系数。
$$f_n=sumlimits_{i=1}^n (-1)^{i-1}{n choose i}2^{i*(n-i)}f_{n-i}$$
将$i*(n-i)$拆成$frac{n2-i2-(n-i)^2}{2}$,于是有
$$f_n = sumlimits_{i=1}{n-1}(-1){i-1}frac{n!}{i!(n-i)!}frac{2{frac{n2}{2}}}{2{frac{i2}{2}}2{frac{(n-i)2}{2}}}f_{n-i} $$
$$ frac{f_n}{2{frac{n2}{2}}n!} = sumlimits_{i=1}{n-1}frac{(-1){i-1}}{2{frac{i2}{2}}i!}frac{f_{n-i}}{2{frac{(n-i)2}{2}}(n-i)!}$$
于是可以分治FFT。
有标号弱联通DAG计数
令有标号DAG数为$F_n$,弱联通有标号DAG数为$f_n$,那么有
$$f_n= F_n-sumlimits_{i=1}^{n-1}{n-1 choose i-1}F_{n-i}f_i$$
真眼熟不是吗?
于是方法同无向连通图个数。
未完待续...