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

  • 相关阅读:
    opencv 图像轮廓特征 图像面积,轮廓周长,外接矩形、最小外接矩形、最小外接圆、拟合椭圆
    opencv cv.findContours 函数详解 图像轮廓层级 图像轮廓检索方式详解
    opencv 绘制图像轮廓
    opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽
    opencv 检测图像边缘 Canny算法应用
    opecv 卷积原理、边缘填充方式、卷积操作详解
    opencv 修改图像对比度、图像亮度
    opencv 实现图像融合
    P1396 营救
    P2296 寻找道路
  • 原文地址:https://www.cnblogs.com/hankeke/p/binomial-inversion.html
Copyright © 2011-2022 走看看