容斥 & 反演
Arghariza
·
·
算法·理论
集合反演
f(S)=\sum\limits_{T\subseteq S}g(T)
g(S)=\sum\limits_{T\subseteq S} (-1)^{|S|-|T|}f(T)
或者
f(S)=\sum\limits_{S\subseteq T}g(T)
g(S)=\sum\limits_{S\subseteq T} (-1)^{|T|-|S|}f(T)
CF1770F Koxia and Sequence
给定非负整数 n,x,y,对于所有满足 \sum\limits_{i=1}^{n}a_i=x 并且 \text{OR}_{i=1}^{n}a_i=y 的 \{a_n\},求 \bigoplus\limits_{i=1}^{n}a_i 的异或和。
- 题解
首先根据对称性,当 $n$ 为偶数时,答案为 $0$。所以只考虑 $n$ 为奇数的情况,为 $a_1$ 的异或和。
拆位,对每一位 $t$,计算 $a_1$ 的第 $t$ 位为 $1$ 的方案数 $\text{mod}\ 2$ 的结果。此时显然 $\bigoplus\limits_{i=1}^{n}a_i$ 第 $t$ 位为 $1$。
考虑容斥,设 $g(y)$ 为按位或为 $y$ 的方案数,$f(y)$ 为按位或为 $y$ 的子集的方案数,显然 $f(y)=\sum\limits_{y'\subseteq y}g(y')$,反演结论得到 $g(y)=\sum\limits_{y'\subseteq y}(-1)^{|y|-|y'|}f(y')$,前提是 $y'$ 第 $t$ 位为 $1$。
由于我们只需要得到 $g(y)$ 的奇偶性,所以我们可以将式子变为 $g(y)\equiv\bigoplus\limits_{y'\subseteq y}f(y')\mod 2$。
因为钦定 $a_1$ 的第 $t$ 位为 $1$,我们可以让 $a_1$ 减去 $2^t$,此时 $\sum\limits_{i=1}^{n}a_i=x-2^t$。 由 $\text{Lucas}$ 定理推论(组合数奇偶性定理)与 $\text{Vandermonde}$ 卷积公式得:
$$\begin{aligned}f(y)&=\sum\limits_{\sum\limits a_i=x-2^t}[a_1\subseteq y-2^t][a_2\subseteq y][a_3\subseteq y]...[a_n\subseteq y]\\&\equiv\sum\limits_{\sum a_i=x-2^t}\dbinom{y-2^t}{a_1}\dbinom{y}{a_2}\dbinom{y}{a_3}...\dbinom{y}{a_n}\mod 2\\&\equiv\dbinom{ny-2^t}{x-2^t}\mod 2\\&\equiv [x-2^t\subseteq ny-2^t]\mod 2\end{aligned}$$
所以答案即为:
$$\begin{aligned}\sum\limits_{t}2^tf(y)&=\sum\limits_t 2^t\bigoplus\limits_{y'\subseteq y,2^t\in y'}g(y')\\&=\sum\limits_t 2^t\bigoplus\limits_{y'\subseteq y,2^t\in y'}[x-2^t\subseteq ny-2^t]\end{aligned}$$
$O(y\log y)$ 枚举 $t,y'$ 即可。
#### SHOI2016 黑暗前的幻想乡
- 题意:
$n$ 个点,$n-1$ 种颜色。每种颜色有 $m_i$ 条边连接 $u_j,v_j$ 两个节点。求颜色数为 $n-1$ 的生成树数量。
$n\le 17$。
- 题解:
实在不会一些不太板的数数题……
考虑以颜色为集合状态,令 $f_{S}$ 为恰有 $S$ 中颜色的生成树数量,$g_{S}$ 为颜色在 $S$ 中的生成树数量。
显然有 $g_{S}=\sum\limits_{T\subseteq S}f_T$。那么 $f_S=\sum\limits_{T\subseteq S}(-1)^{|S|-|T|}g_T$。
所以答案就是 $f_U=\sum\limits_{T}(-1)^{n-1-|T|}g_T$,枚举 $T$ 然后把 $T$ 所有颜色拉出来求无向图生成树个数即可。
可以 $\text{matrix\ tree}$ 定理。复杂度 $O(2^nn^3)$。
#### 二项式反演
这个形式有点多,最常用的:
$$f(n)=\sum\limits_{i=0}^n\dbinom{n}{i}g(i)$$
$$g(n)=\sum\limits_{i=0}^n(-1)^{n-i}\dbinom{n}{i}f(i)$$
不太常用的:
$$f(n)=\sum\limits_{i=0}^n(-1)^i\dbinom{n}{i}g(i)$$
$$g(n)=\sum\limits_{i=0}^n(-1)^{i}\dbinom{n}{i}f(i)$$
这主要告诉我们 $A_{ii}=(-1)^i\dbinom{n}{i}$ 这个矩阵是**自逆**的。
例题有点板。我数学怎么这么菜。
#### 莫比乌斯反演
形式 $1$(约数形式):
$$f(n)=\sum\limits_{d\mid n} g(d)$$
$$g(n)=\sum\limits_{d\mid n}\mu(d)f(\frac{n}{d})$$
这是显然的,由 $f=g*I,\mu =I^{-1}$ 可推出 $g=f*\mu$。
形式 $2$(倍数形式):
$$f(n)=\sum\limits_{n\mid d}g(d)$$
$$g(n)=\sum\limits_{n\mid d}\mu(\frac{d}{n})f(d)$$
这鬼东西有点抽象,找时间补个证明。
一般用于解决数论问题,找不到什么高妙不板的例题。
---
下面是科技。
#### Min-Max 容斥
对于满足全序关系并且其中元素满足可加减性的**可重**集合 $S$,有:
$$\max\{S\}=\sum\limits_{T\subseteq S}(-1)^{|T|-1}\min\{T\}$$
$$\min\{S\}=\sum\limits_{T\subseteq S}(-1)^{|T|-1}\max\{T\}$$
证明(参考 `OI Wiki` ):
考虑构造映射 $f:S_k\to \{1,2,...,k\}$,$S_k$ 为 $S$ 中第 $k$ 大元素,显然这是双射。
那么 $f(\min(x,y))=f(x)\cap f(y),f(\max(x,y))=f(x)\cup f(y)$。
所以:
$$\begin{aligned}\begin{vmatrix}f(\max\{S\})\end{vmatrix}&=\begin{vmatrix}\bigcup\limits_{t\in S}f(t)\end{vmatrix}\\&=\sum\limits_{T\subseteq S}(-1)^{|T| -1}\begin{vmatrix}\bigcap\limits_{t\in T}f(t)\end{vmatrix}\\&=\sum\limits_{T\subseteq S}(-1)^{|T| -1}\begin{vmatrix}f(\min\{T\})\end{vmatrix}\end{aligned}$$
两边的 $f$ 都可以映射回去,用类似的证法可以把左式换成最小值,所以 $\text{Min-Max}$ 容斥成立。
事实上,$\text{Min-Max}$ 容斥也可以作用于期望:
$$E(\max\{S\})=\sum\limits_{T\subseteq S}(-1)^{|T|-1}E(\min\{T\})$$
$$E(\min\{S\})=\sum\limits_{T\subseteq S}(-1)^{|T|-1}E(\max\{T\})$$
证明可以考虑期望的定义式,注意 $S_0$ 代表 $S$ **所有可能出现元素**的并:
$$\begin{aligned}E(\max\{S\})&=\sum\limits_{S'\subseteq S_0}P(S'=S)\max\{S'\}\\&=\sum\limits_{S'\subseteq S_0}P(S'=S)\sum\limits_{T\subseteq S'}(-1)^{|T|-1}\min\{T\}\\&=\sum\limits_{T\subseteq S_0}(-1)^{|T|-1}\sum\limits_{T\subseteq S'}P(S'=S)\min\{T\}\\&=\sum\limits_{T\subseteq S_0}(-1)^{|T|-1}E(\min(T))\end{aligned}$$
需要注意的是倒数第二行 $\sum\limits_{T\subseteq S'}P(S'=S)\min\{T\}$ 中即使 $S'$ 带附加条件,这个式子仍然表示的是 $T$ 的期望最小值,理由可以自行思考(
#### HAOI2015 按位或
- 题意:
刚开始你有一个数字 $0$,每一秒钟你会随机选择一个 $[0,2^n-1]$ 的数字,与你手上的数字进行或(C++,C 的 `|`,pascal 的 `or`)操作。选择数字 $i$ 的概率是 $p_i$。保证 $0\leq p_i \leq 1$,$\sum p_i=1$ 。问期望多少秒后,你手上的数字变成 $2^n-1$。
$n\le 20$。
- 题解:
根据 $\text{Min-Max}$ 容斥原理:
$$E(\max\{S\})=\sum\limits_{T\subseteq S} (-1)^{|T|-1}E(\min\{T\})$$
本题中 $S$ 代表一个位数的集合,$\max\{S\}$ 为 $S$ 中元素最后一个变为 $1$ 的时间,$\min\{T\}$ 为 $T$ 中元素第一个变为 $1$ 的时间,显然答案就是左式 $E(max\{S\})$。
考虑求解 $E(\min\{T\})$,由于 $T$ 中至少有一个元素变为 $1$ 的概率为 $\sum\limits_{T'\cap T\neq \varnothing}P_{T'}$,根据期望的定义我们知道 $E(\min\{T\})=\dfrac{1}{\sum\limits_{T'\cap T\neq \varnothing}P_{T'}}$,其中 $U$ 表示全集 $\{0,1,...,n-1\}$。
这个有交的东西比较难搞,正难则反,考虑 $U$ 的补集,则 $E(\min\{T\})=\dfrac{1}{\sum\limits_{T'\cap T\neq \varnothing}P_{T'}}=\dfrac{1}{1-\sum\limits_{T'\subseteq U\setminus T}P_{T'}}$。
于是问题变为求解 $\sum\limits_{T'\subseteq T}P_{T'}$,这显然是一个 `FWT` 的或运算变换,直接 $O(n2^n)$ 做即可。
最后枚举每个 $T$,求其贡献即可,复杂度 $O(n2^n)$。
#### PKUWC2018 随机游走
- 题意:
给定一棵 $n$ 个结点的树,你从点 $x$ 出发,每次等概率随机选择一条与所在点相邻的边走过去。
有 $Q$ 次询问,每次询问给定一个集合 $S$,求如果从 $x$ 出发一直随机游走,直到点集 $S$ 中所有点都至少经过一次的话,期望游走几步。
特别地,点 $x$(即起点)视为一开始就被经过了一次。
$n\le 18$,$Q\le 5000$,对 $998244353 $ 取模。
- 题解:
求集合内最大时间的期望,一眼 $\text{Min-Max}$ 容斥。
$$E(\max\{S\})=\sum\limits_{T\subseteq S} (-1)^{|T|-1}E(\min\{T\})$$
~~为什么我每题都要写一遍这个式子。~~
左式即为所求,考虑右式 $E(\min\{T\})$ 怎么做,它的意义为对于每一个 $T\subseteq S$,求出随机游走并第一次走到 $u\in T$ 的期望时间。
对于随机游走问题,可以用 dp 解决。
设 $f_{T,i}$ 表示树上从 $i$ 游走到第一个 $T$ 中的点的期望时间。
那么显然:
- $f_{T,i}=0,i\in T
-
f_{T,i}=1+\frac{1}{deg_i}\sum\limits_{(u,i)\in E}f_{T,u},\text{otherwise}
应该注意的是这里状态转移之间包含了环,所以不能直接从下往上或从上往下递推。
对于这类随机游走问题,我们一般使用高斯消元求解,但是这题使用高斯消元是 O(n^3) 的,预处理就需要 O(2^nn^3\log w),显然超时。但是树上随机游走问题我们有一些特殊的技巧。
为了简化算式,以下 f_{T,i} 简记为 f_i,读者需要知道这是对于每一个 T 而言的。
首先考虑叶子节点 u,显然它能够被表示成 A_u+B_u\times f_{fa_u} 的形式:如果 u\in T,那么 A_u=B_u=0,否则 A_u=B_u=1。
然后我们考虑归纳,假设节点 u 的所有儿子 v_1,v_2,...,v_m 均可以表示成 A_{v_i}+B_{v_i}\times f_u 的形式,那么对于节点 u :
- 显然存在 A_u=B_u=0 使得 f_u=0,u\in T
- 若 u\notin T,则:
\begin{aligned}f_u=1+\frac{1}{deg_u}\left(f_{fa_u}+\sum\limits_{i=1}^mA_{v_i}+B_{v_i}\times f_u\right)\end{aligned}
那就解一个方程即可:
f_u=\dfrac{deg_u+\sum\limits_{i=1}^{m}A_{v_i}}{deg_u-\sum\limits_{i=1}^{m}B_{v_i}}+\dfrac{f_{fa_u}}{deg_u-\sum\limits_{i=1}^{m}B_{v_i}}
令 A_u=\dfrac{deg_u+\sum\limits_{i=1}^{m}A_{v_i}}{deg_u-\sum\limits_{i=1}^{m}B_{v_i}},B_u=\dfrac{1}{deg_u-\sum\limits_{i=1}^{m}B_{v_i}} 即可满足 f_u=A_u+B_{u}\times f_{fa_u}。
那么我们令 x 作为根,从儿子向根递推能得到每个点的 A_u,B_u,由于 x 没有父亲,那么 f_{T,x}=A_x,我们就能 O(2^nn\log w) 得到对于每一个 T,E(\min\{T\}) 的值,记为 g_{T}。
那么对于每一个 S,我们只需要求 \sum\limits_{T\subseteq S}(-1)^{|T|-1}g_{T},跑 FWT 或变换即可。
拓展 Min-Max 容斥
由于我被神仙 sinsop90 踩爆了,所以添加一点内容。
事实上,\text{Min-Max} 容斥可以求出第 k 大小:
\max_k\{S\}=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\dbinom{|T|-1}{k-1}\min\{T\}
\min_k\{S\}=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\dbinom{|T|-1}{k-1}\max\{T\}
E(\max_k\{S\})=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\dbinom{|T|-1}{k-1}E(\min\{T\})
E(\min_k\{S\})=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\dbinom{|T|-1}{k-1}E(\max\{T\})
证明略。
P4707 重返现世
有 n 种原料,需要集齐任意 k 种。
每个单位时间会随机生成一种原料。每种原料被生成的概率是不同的,第 i 种原料被生成的概率是 \frac{p_i}{m} 。
求收集到任意 k 种原料的期望时间,答案对 998244353 取模。
- 题解:
我们可以把题目看作每个原料有一个生成时间,即求第 $n-k+1$ 大的期望值。为了简化式子,以下令 $k\gets n-k+1$,显然 $k\le 11$,并且求的是第 $k$ 大的期望。
套用拓展 $\text{Min-Max}$ 容斥,把前 $k$ 大转换成最小:
$$E(\max\limits_{k}(S))=\sum\limits_{T\subseteq S} \dbinom{|T|-1}{k-1}(-1)^{|T|-k}E(\min(T))$$
显然对于每一种 $T$,可以把 $T$ 中的原料看成一类,其它的看作另一类,那么抽到 $T$ 中原料的概率显然就是 $P_T=\dfrac{\sum\limits_{i\in T}p_i}{m}$,由于$E(\min(T))$ 表示第一次抽到 $T$ 中原料的期望时间,所以由简单期望知识我们知道 $E(\min(T))=\dfrac{1}{P_T}=\dfrac{m}{\sum\limits_{i\in T}p_i}$。
所以
$$\begin{aligned}ans_k&=\sum\limits_{T\subseteq S} \dbinom{|T|-1}{k-1}(-1)^{|T|-k}\dfrac{m}{\sum\limits_{i\in T}p_i}\\&=m\sum\limits_{T\subseteq S} \dfrac{\dbinom{|T|-1}{k-1}(-1)^{|T|-k}}{\sum\limits_{i\in T}p_i}\end{aligned}$$
然后考虑 $dp$,由于 $k$、$m$ 都很小,于是可以纳入状态,令 $dp_{i,j,k}$ 表示当前考虑前 $i$ 种原料,$\sum\limits_{i\in T}p_i=j$ 的时候 $\sum\limits_{T\subseteq S}\dbinom{|T|-1}{k-1}(-1)^{|T|-k}$ 的值。
转移的话,其实非常显然。
- 首先你可以不取 $i$,$dp_{i,j,k}\gets dp_{i-1,j,k}$。
- 其次,如果你选了 $i$,那么:
$\dbinom{|T|-1}{k-1}(-1)^{|T|-k}=\dbinom{|T|-2}{k-2}(-1)^{(|T|-2)-(k-2)}-\dbinom{|T|-2}{k-1}(-1)^{(|T|-2)-(k-1)}
于是这种情况可以从 dp_{i-1,j-p_i,k} 与 dp_{i-1,j-p_i,k-1} 转移过来。
总的转移式子就是:
dp_{i,j,k}=dp_{i-1,j,k}+dp_{i-1,j-p_i,k-1}-dp_{i-1,j-p_i,k}
#### 单位根反演
$$[n\mid k]=\frac{1}{n}\sum\limits_{d=0}^{n-1}\omega_{n}^{ik}$$
这个东西没啥用,但是:
**单位根反演常用于求某个多项式特定倍数的系数和。**
$$\begin{aligned}\sum\limits_{i=0}^{\lfloor\frac{n}{k}\rfloor}[x^{ik}]f(x)&=\sum\limits_{i=0}^n[k\mid i][x^i]f(x)\\&=\sum\limits_{i=0}^n[x^i]f(x)\frac{1}{k}\sum\limits_{j=0}^{k-1}\omega_{k}^{ij}\\&=\frac{1}{k}\sum\limits_{i=0}^na_i\sum\limits_{j=0}^{k-1}\omega_{k}^{ij}\\&=\frac{1}{k}\sum\limits_{i=0}^n\sum\limits_{j=0}^{k-1}a_i(\omega_k^j)^i\\&=\frac{1}{k}\sum\limits_{j=0}^{k-1}f(\omega_k^j)\end{aligned}$$
推论:
$$\sum\limits_{i=0}^{\lfloor\frac{n}{k}\rfloor}[x^{ik+r}]f(x)=\frac{1}{k}\sum\limits_{j=0}^{k-1}f(\omega_k^j)\omega_{k}^{-ir}$$