zoukankan      html  css  js  c++  java
  • 学习笔记

    二项式反演

    二项式反演的常见形式有如下两种:

    [f(n) = sum_{i=m}^n inom ni g(i) Longleftrightarrow g(n) = sum_{i=m}^n (-1)^{n-i} inom ni f(i) ]

    [f(n) = sum_{i=n}^m inom in g(i) Longleftrightarrow g(n) = sum_{i=n}^m (-1)^{i-n} inom in f(i) ]

    我这里简要讲一下第一个式子的证明。只讲证明,不讲推导。

    [egin{align*} g(n) &= sum_{i=m}^n(-1)^{n-i}inom ni f(i)\ &= sum_{i=m}^n(-1)^{n-i}inom ni sum_{j=m}^i inom ijg(j)\ &= sum_{j=m}^ng(j)sum_{i=j}^n(-1)^{n-i}inom niinom ij\ &= sum_{j=m}^ng(j)sum_{i=j}^n(-1)^{n-i}inom njinom{n-j}{i-j}\ &= sum_{j=m}^ninom njg(j)sum_{i=j}^n(-1)^{n-i}inom{n-j}{i-j}\ &= sum_{j=m}^ninom njg(j)sum_{t=0}^{n-j}(-1)^{n-j-t}inom{n-j}t\ &= sum_{j=m}^ninom njg(j)(-1)^{n-j}sum_{t=0}^{n-j}(-1)^{t}inom{n-j}t\ end{align*} ]

    可以发现,如果 (n-j eq 0),那么,(sumlimits_{t=0}^{n-j}(-1)^{t}inom{n-j}t = 0)。但是如果 (n-j = 0),那么就只会算一个 (inom 00 = 1)。也就是说,只有在 (j=n) 的时候,后面才会有用, 这个时候 (inom nn g(n)(-1)^0 = g(n)),因此 (g(n) = g(n))

    证毕。

    至于第二个式子,可以把第一个式子改造改造,或者用类似第一个式子的证法就可以证明了。

    应用

    求第二类斯特林数

    众所周知,第二类斯特林数 (S(n, k) = egin{Bmatrix}n\k end{Bmatrix}) 表示 (n) 个不同的小球放进 (k) 个相同的盒子,且盒子不能为空的方案数。

    所以我们很容易得到一个简单的递推式:

    [egin{Bmatrix}n\k end{Bmatrix} = egin{Bmatrix}n-1\k-1 end{Bmatrix}+egin{Bmatrix}n-1\k end{Bmatrix}cdot k ]

    如果我们需要求出所有的 (S(n, i)),这样直接递推是 (O(n^2)) 的。但是结合二项式反演,我们可以 (O(nlog n)) 求出所有的 (S(n, i))

    既然第二类斯特林数要求盒子不能为空,那么我们就可以很容易的得到一个这样的等式。

    [k^n = sum_{i=0}^k i! inom ki egin{Bmatrix}n\iend{Bmatrix} ]

    左边表示把 (n) 个不同小球放进 (k)不同的盒子,且可以为空,右边的话,就是先枚举有哪些盒子是不为空的,然后用斯特林数求一下方案数,乘上从 (k) 个盒子中选择 (i) 个数组合起来的方案数;但是这样求出来的相同的盒子的方案,因此还需要乘上 (i!)

    我们令 (f(k) = k^n)(g(k)=k!egin{Bmatrix}n\k end{Bmatrix})。根据上面的结论,有

    [f(k) = sum_{i=0}^k inom ki g(i) ]

    那么直接二项式反演

    [g(k)=sum_{i=0}^k(-1)^{k-i}inom ki f(i)\ k!egin{Bmatrix}n\k end{Bmatrix}=sum_{i=0}^k (-1)^{k-i}inom kii^n\ egin{align*} egin{Bmatrix}n\k end{Bmatrix} &= frac 1{k!}sum_{i=0}^k (-1)^{k-i}inom kii^n\ &= frac 1{k!}sum_{i=0}^k frac {(-1)^{k-i}k!i^n}{i!(k-i)!}\ &= sum_{i=0}^k frac {(-1)^{k-i}i^n}{i!(k-i)!} end{align*} ]

    我们令 (A_i = frac{i^n}{i!})(B_i = frac{(-1)^i}{i!})。用 FFT 将 (A)(B) 做卷积就可以了。

    题目

    BZOJ2839 集合计数 题解

    BZOJ已经没有什么好害怕的了 题解

    参考资料

    https://www.cnblogs.com/GXZlegend/p/11407185.html

    http://blog.miskcoo.com/2015/12/inversion-magic-binomial-inversion

  • 相关阅读:
    卤菜技巧
    JS实现延迟
    软件项目版本号的命名规则及格式
    EF复合主键
    验证码和验证控件
    还原数据库,数据库提示正在还原中的处理办法
    更新汇总行
    centOS7挂在windows移动硬盘方法
    关于this、Echarts中的data
    SQLServer 查看SQL语句的执行时间
  • 原文地址:https://www.cnblogs.com/hankeke/p/binomial-inversion.html
Copyright © 2011-2022 走看看