容斥与反演
容斥
容斥原理
用于不重不漏地【表达/转化】某集合
广义容斥:合法方案数 = 总方案数 - 不合法方案数
狭义容斥:
\[\left|\bigcup_{i = 1}^{n}S_i\right|=\sum_{x = 1}^{n}(-1)^{x - 1}\sum_{i_1<i_2<\cdots <i_x}\left|\bigcap_{j = 1}^{x}S_{i_j}\right|
\]
我们来证明一下容斥系数为什么是 \((-1)^{x - 1}\)
一个被n个集合包含的元素,那么它的容斥系数之和为:
\[\sum_{i = 1}^{n}(-1)^{i - 1}\binom{n}{i}=\sum_{i = 0}^{n}(-1)^{i-1}\binom{n}{i}-(-1)\binom{n}{0}=0-(-1)=1
\]
Min-Max容斥
\[\max(S)=\sum_{T\subseteq S}(-1)^{|T|-1}\min(T)\\
\min(S)=\sum_{T\subseteq S}(-1)^{|T|-1}\max(T)
\]
其中 max(S) 表示集合 S 中所有元素的最大值。
证明:对于第k+1大的元素,有k个比它小的集合。以它为最小值的,大小为 i 的集合有 \(\binom k{i-1}\) 个,所以它的统计次数为:
\[\sum_{i = 1}^{k + 1}\binom{k}{i - 1}(-1)^{i - 1}=\sum_{i = 0}^{k}\binom{k}{i}(-1)^{i}=[k = 0]
\]
推广到求第 k 大的元素:
\[\mathrm{kthmax}(S)=\sum_{T\subseteq S}(-1)^{|T|-k}\binom{|T|-1}{k - 1}\min(T)\\
\mathrm{kthmin}(S)=\sum_{T\subseteq S}(-1)^{|T|-k}\binom{|T|-1}{k - 1}\max(T)
\]
其中 kthmax(S) 表示集合 S 中所有元素的第 k 大值。证明与上面的类似。
min-max容斥还有很好的期望意义,这是min-max容斥得以广泛使用的重要原因:
\[E(\max(S))=\sum_{T\subseteq S}(-1)^{|T|-1}E(\min(T))\\
E(\min(S))=\sum_{T\subseteq S}(-1)^{|T|-1}E(\max(T))\\
E(\mathrm{kthmax}(S))=\sum_{T\subseteq S}(-1)^{|T|-k}\binom{|T|-1}{k - 1}E(\min(T))\\
E(\mathrm{kthmin}(S))=\sum_{T\subseteq S}(-1)^{|T|-k}\binom{|T|-1}{k - 1}E(\max(T))
\]
反演
反演的本质就是容斥。
我们从一下几种常见的反演来讲:
二项式反演
\[f(n)=\sum_{i = 0}^{n}\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i = 0}^{n}(-1)^{n - i}\binom{n}{i}f(i)\\
f(n)=\sum_{i = n}^{m}\binom{i}{n}g(i)\Leftrightarrow g(n)=\sum_{i = n}^{m}(-1)^{i - n}\binom{i}{n}f(i)
\]
因为第二个式子可以由第一个式子推出,所以我们先证明第一个。
组合意义证明
记\(f_n\)表示恰好使用n个不同元素形成特定结构的方案数,\(g_n\)表示从n个不同元素中钦定若干个元素形成特定结构的总方案数。
于是有:\(g_n = \sum^n_{i=0}\binom{n}{i}f_i\)
使用容斥原理,可以得到:\(f_n = \sum^n_{i=0}(-1)^{n-i}\binom nmg_i\)
这个因该很好感性理解,下面是严谨证明$\downarrow $
代数证明:(某知名竞赛教练在白板上的珍贵推导过程)


例:例题
我们用矩阵描述这一过程:
\[\underbrace{
\begin{pmatrix}
\binom{0}{0} & 0 & \cdots & 0 \\
\binom{1}{0} & \binom{1}{1} & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
\binom{n}{0} & \binom{n}{1} & \cdots & \binom{n}{n}
\end{pmatrix}
}_{\boldsymbol{A}}
\begin{pmatrix}
f_0 \\
f_1 \\
\vdots \\
f_n
\end{pmatrix}
=
\begin{pmatrix}
g_0 \\
g_1 \\
\vdots \\
g_n
\end{pmatrix}
\Leftrightarrow
\]
\[\underbrace{
\begin{pmatrix}
\binom{0}{0} & 0 & \cdots & 0 \\
-\binom{1}{0} & \binom{1}{1} & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
(-1)^n\binom{n}{0} & (-1)^{n - 1}\binom{n}{1} & \cdots & \binom{n}{n}
\end{pmatrix}
}_{\boldsymbol{B}}
\begin{pmatrix}
g_0 \\
g_1 \\
\vdots \\
g_n
\end{pmatrix}=
\begin{pmatrix}
f_0 \\
f_1 \\
\vdots \\
f_n
\end{pmatrix}
\]
刚才给出的证明等价于证明A·B=I。
将A和B转置(延对角线翻着)之后得到的矩阵仍然是互逆的.
所以 \(g_m = \sum_{i = m}^{n} \binom{i}{m} f_i \Longleftrightarrow f_m = \sum_{i = m}^{n} (-1)^{i - m} \binom{i}{m} g_i\)
高维的二项式反演
\[f(x,y) = \sum_{i=x}\sum_{j=y}\binom ix\binom jyg(i,j) \Longleftrightarrow g(x,y)=\sum_{i=x}\sum_{j=y}(-1)^{i+j-x-y}\binom ix\binom jyf(x,y)
\]
看起来就比较合理,具体怎么证的我还真不知道。
例题. (题解来自command_block,有小幅度改动)
题意:有一个 \(n\times n\) 的正方形网格,用三种颜色染。求有多少种方案使得至少一行或一列是同一种颜色。\(n\leq 10^6\)。
令:
-
\(F(i,j)\):钦定有 \(i\) 行 \(j\) 列是同种颜色,其余任意的方案数。
-
\(G(i,j)\):为恰好有 \(i\) 行 \(j\) 列是同种颜色的方案数。
答案:\(3^{n^2}-G(0,0)\)。
由组合意义易得
\[F(x,y)=\sum\limits_{i=x}^n\sum\limits_{j=y}^n\dbinom{i}{x}\dbinom{j}{y}G(i,j)
\]
套用高维二项式反演
\[\begin{aligned}
G(x,y)
&=\sum\limits_{i=x}^n\sum\limits_{j=y}^n(-1)^{i+j-x-y}\dbinom{i}{x}\dbinom{j}{y}F(i,j)\\
G(0,0)
&=\sum\limits_{i=0}^n\sum\limits_{j=0}^n(-1)^{i+j}F(i,j)
\end{aligned}
\]
接下来考虑如何快速计算 \(F(i,j)\),需要分类讨论。
-
\(i,j\neq 0\):所有被钦定的行和列必须是同种颜色。
\[F(i,j)=\dbinom{n}{i}\dbinom{n}{j}\cdot 3\cdot 3^{(n-i)(n-j)}
\]
即:选定行列 x 钦定颜色 x 其余自由部分
-
\(j=0\):被钦定的行不必是同种颜色。
\[F(i,0)=\dbinom{n}{i}\cdot3^i\cdot3^{n(n-i)}
\]
即:选定行 x 钦定颜色 x 其余自由部分
(\(i=0\) 同理)
-
\(i=j=0\):完全自由,\(F(0,0)=3^{n^2}\)。
回忆:
\[G(0,0)=\sum_{i=0}^n\sum_{j=0}^n(-1)^{i+j}F(i,j)
\]
根据上述讨论,分三部分求和。
\[\begin{aligned}
S_1
&=\sum_{i=1}^n\sum_{j=1}^n(-1)^{i+j}F(i,j)\\
&=\sum_{i=1}^n\sum_{j=1}^n(-1)^{i+j}\dbinom{n}{i}\dbinom{n}{j}3^{(n-i)(n-j)+1}\\
&=3^{n^2+1}\sum_{i=1}^n\dbinom{n}{i}(-1)^i3^{-in}\,\boxed{\sum_{j=1}^n\dbinom{n}{j}(-1)^{j}3^{j(i-n)}}\\
&=3^{n^2+1}\sum_{i=1}^n\dbinom{n}{i}(-1)^i3^{-in}\left((1-3^{i-n})^n-1\right)
\end{aligned}
\]
快速幂就可以 \(O(n\log n)\) 计算了。
\(i,j\) 为 \(0\) 本质相同,只统计 \(j=0\) 的情形,然后将贡献翻倍即可。
\[\begin{aligned}
S_2&=2\sum_{i=1}^n(-1)^{i}\dbinom{n}{i}^{i+n(n-i)}\\
&=2\cdot3^{n^2}\,\boxed{\sum_{i=1}^n\dbinom{n}{i}(-1)^{i}3^{i(1-n)}}\\
&=2\cdot3^{n^2}\left((1-3^{1-n})^n-1\right)\\
\end{aligned}
\]
- 第三部分:两个参数均为 \(0\)。\(S_3=3^{n^2}\)。
最终 \(G(0,0)=S_1+S_2+S_3\)。
总复杂度 \(O(n\log n)\)。
子集反演
\[f(S)=\sum_{T\subseteq S}g(T)\Longleftrightarrow g(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}f(T)\\
f(S)=\sum_{S\subseteq T}g(T)\Longleftrightarrow g(S)=\sum_{S\subseteq T}(-1)^{|T|-|S|}f(T)
\]
第二个式子由第一个式子取补得到。
而对于第一个式子的证明,我们选择讲左式代入右式:
\[g(S) = \sum_{T\subseteq S}(-1)^{|S|-|T|}\sum_{X\subseteq T}g(X)=\sum_{X\subseteq S}g(X)\sum_{X\subseteq T\subseteq S}(-1)^{|S|-|T|}
\]
改为枚举集合T的大小:
\[\begin{align*}
\text{上式}&=\sum_{X\subseteq S}g(X)\sum_{i = |X|}^{|S|}\binom{|S|-|X|}{i - |X|}(-1)^{|S|-i}\\
&=\sum_{X\subseteq S}g(X)\sum_{i = 0}^{|S|-|X|}\binom{|S|-|X|}{i}(-1)^{|S|-|X|-i}\\
&=\sum_{X\subseteq S}g(X)[|X| = |S|]=g(S) \\\Box
\end{align*}
\]
对比二项式反演和子集反演,二项式反演针对的是集合的大小,是钦定 k 个数而不是钦定一个集合,而子集反演针对的就是一个集合。故二项式反演要乘上一个选数方案的组合数。
斯特林反转
\[f(n)=\sum_{k = 0}^{n}\left\{\begin{array}{l}n\\k\end{array}\right\}g(k)\Longleftrightarrow g(n)=\sum_{k = 0}^{n}(-1)^{n - k}\left[\begin{array}{l}n\\k\end{array}\right]f(k)\\
f(m)=\sum_{k = m}^{n}\left\{\begin{array}{l}k\\m\end{array}\right\}g(k)\Longleftrightarrow g(m)=\sum_{k = m}^{n}(-1)^{k - m}\left[\begin{array}{l}k\\m\end{array}\right]f(k)
\]
带入用反转公式可以验证。
单位根反演
这里用 \(w_i\) 代表 \(w_i^n\)
\[\sum\limits_{i=0}^{n-1}{w_i^k}=n[n\mid k]
\]
证明:
\[\sum\limits_{i=0}^{n-1}{w_i^k} = \sum\limits_{i=0}^{n-1}{w_k^i}
\]
该式为等比数列,所以:
\[\sum\limits_{i=0}^{n-1}{w_k^i} =
\begin{cases}
&n \text{ if } w_k = 1 \\
&{1 - w_k^n \over 1 - w_k} \text{ if } w_k != 1
\end{cases}
\]
观察到,\(w_k^n = w_{nk} = 1\),并且 \(w_k = 1 \Leftrightarrow n|k\)
所以上式化简为:\(\frac1n\sum\limits_{i=0}^{n-1}{w_n^{ik}}=[n\mid k]\)
用处:1. 证明 FFT。 2. 处理 [n|k]
例题:【集训队作业2018】复读机
题意:对一个长度为n的排列进行染色,一共k种颜色,要求每种颜色使用的次数都是d的倍数,求方案数。
\(d = 1\) 答案显然是 \(k^n\)。
纯色生成函数:
\[F(x) = \sum_{d|i}\dfrac{x^i}{i!}
\]
答案就是:
\[n![x^n]F(x)^k
\]
开始大力推式子!
\[\begin{aligned}
F(x) &= \sum_{d|i}\dfrac{x^i}{i!}\\
& = \sum_{i}[d|i]\dfrac{x^i}{i!}\\
& = \sum_{i}\frac1d\sum_{j=0}^{d-1}w_d^{ji}\dfrac{x^i}{i!}\\
& = \frac1d\sum_{i}\sum_{j=0}^{d-1}\dfrac{(w_d^jx)^i}{i!}\\
& = \frac1d\sum_{j=0}^{d-1}\sum_{i}\dfrac{(w_d^jx)^i}{i!}\\
& = \frac1d\sum_{j=0}^{d-1}e^{w_d^jx}\\
\end{aligned}
\]
当 d = 2 时,带入原式,然后暴力二项式展开:
\[\begin{aligned}
ans&=n^k\\
& =n)^k\\
& =n)^k\\
& =n![x^n]\frac1{2^k}(e^{x}+e^{-x})^k\\
& =n![x^n]\frac1{2^k}\sum_i\binom kie^{ix}e^{-(k-i)x}\\
& =n![x^n]\frac1{2^k}\sum_i\binom kie^{ix-(k-i)x}\\
& =\frac1{2^k}\sum_i\binom kin![x^n]e^{(2i-k)x}\\
& =\frac1{2^k}\sum_i\binom ki(2i-k)^n\\
\end{aligned}
\]
复杂度 \(O(k\log n)\)。
当 d = 3 时,还是暴力展开三项式:
\[=n![x^n]\dfrac{1}{3^k}\sum\limits_{i=0}^k\dbinom{k}{i}\sum\limits_{j=0}^i\dbinom{i}{j}e^{ix}e^{jw_3x}e^{(k-i-j)w_3^2x}
\]
\[=n![x^n]\dfrac{1}{3^k}\sum\limits_{i=0}^k\dbinom{k}{i}\sum\limits_{j=0}^i\dbinom{i}{j}e^{(i+jw_3+(k-i-j)w_3^2)x}
\]
提取系数得
\[=\dfrac{1}{3^k}\sum\limits_{i=0}^k\dbinom{k}{i}\sum\limits_{j=0}^i\dbinom{i}{j}\big(i+jw_3+(k-i-j)w_3^2\big)^n
\]
计算复杂度为\(O(k^2\log k)\)。
莫比乌斯反演
\[g(n)=\sum_{i|n}f(i)\Longleftrightarrow f(n)=\sum_{i|n}\mu\left(\frac{n}{i}\right)g(i)
\]
不过这玩意一般不是这么用的,详见这里