学习笔记 - 二项式反演

二项式反演

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

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

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

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

\[\begin{align*} g(n) &= \sum_{i=m}^n(-1)^{n-i}\binom ni f(i)\\ &= \sum_{i=m}^n(-1)^{n-i}\binom ni \sum_{j=m}^i \binom ijg(j)\\ &= \sum_{j=m}^ng(j)\sum_{i=j}^n(-1)^{n-i}\binom ni\binom ij\\ &= \sum_{j=m}^ng(j)\sum_{i=j}^n(-1)^{n-i}\binom nj\binom{n-j}{i-j}\\ &= \sum_{j=m}^n\binom njg(j)\sum_{i=j}^n(-1)^{n-i}\binom{n-j}{i-j}\\ &= \sum_{j=m}^n\binom njg(j)\sum_{t=0}^{n-j}(-1)^{n-j-t}\binom{n-j}t\\ &= \sum_{j=m}^n\binom njg(j)(-1)^{n-j}\sum_{t=0}^{n-j}(-1)^{t}\binom{n-j}t\\ \end{align*} \]

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

证毕。

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

应用

求第二类斯特林数

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

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

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

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

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

\[k^n = \sum_{i=0}^k i! \binom ki \begin{Bmatrix}n\\i\end{Bmatrix} \]

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

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

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

那么直接二项式反演

\[g(k)=\sum_{i=0}^k(-1)^{k-i}\binom ki f(i)\\ k!\begin{Bmatrix}n\\k \end{Bmatrix}=\sum_{i=0}^k (-1)^{k-i}\binom kii^n\\ \begin{align*} \begin{Bmatrix}n\\k \end{Bmatrix} &= \frac 1{k!}\sum_{i=0}^k (-1)^{k-i}\binom 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

posted @ 2019-09-10 20:53  hankeke303  阅读(246)  评论(0编辑  收藏  举报