二项式反演
二项式反演的常见形式有如下两种:
\[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