zoukankan      html  css  js  c++  java
  • 一些计数问题相关的方法

    组合数

    基本计算方式:

    $${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$$

    真眼熟不是吗?
    于是方法同无向连通图个数。

    未完待续...

  • 相关阅读:
    git知识点总结
    自动化进阶
    unittest单元测试框架
    自动化测试模型
    webdriver
    python文件处理
    uva 11077 置换
    poj 1066 Treasure Hunt
    poj 2661 Factstone Benchmark
    hdu 4180
  • 原文地址:https://www.cnblogs.com/zltttt/p/8661358.html
Copyright © 2011-2022 走看看