容斥、反演学习笔记

下面将会是各种反演、容斥

二项式定理

一般形式:

\[(x + y)^n = \sum_{i=0}^n \binom{n}{i} x^i y^{n-i} \]

广义二项式定理:

\[(x_1 + \cdots + x_t)^n = \sum_{n_1 + \cdots + n_t = n} \binom{n}{n_1, \cdots, n_t} x_1^{n_1} \cdots x_t^{n_t} \]

下面会用到的组合恒等式

\[\binom{a}{b} \binom{b}{c} = \binom{a}{c} \binom{a-c}{b-c} \]

\[[n = 0] = \sum_{i=0}^n \binom{n}{i} (-1)^i \]

至少与恰好

在计数题中,所谓“至少”经常不是朴素地限制数量至少为 \(k\)。

更常见的是钦定了 \(k\) 个性质必须满足;剩下的性质不作限制。

至少和恰好可以相互转化,应用二项式反演。

二项式反演

四种形式

\(g(i)\) 表示至少/至多 \(i\) 个,\(f(i)\) 表示恰好 \(i\) 个,这样就可以实现至少/至多和恰好的转化。

二项式反演的常见形式主要有以下4种:

形式一:

\[g(n) = \sum_{i=0}^n (-1)^i \binom{n}{i} f(i) \iff f(n) = \sum_{i=0}^n (-1)^i \binom{n}{i} g(i) \]

形式二:

\[g(n) = \sum_{i=0}^n \binom{n}{i} f(i) \iff f(n) = \sum_{i=0}^n (-1)^{n-i} \binom{n}{i} g(i) \]

形式三:

\[g(n) = \sum_{i=n}^{N} (-1)^i \binom{i}{n} f(i) \iff f(n) = \sum_{i=n}^{N} (-1)^i \binom{i}{n} g(i) \]

形式四(最常用):

\[g(n) = \sum_{i=n}^{N} \binom{i}{n} f(i) \iff f(n) = \sum_{i=n}^{N} (-1)^{i-n} \binom{i}{n} g(i) \]

如何应用

以形式二为例,\(g(i)\) 表示至少 \(i\) 个,\(f(i)\) 表示恰好 \(i\) 个。这样就可以实现至少和恰好的转化。

基础容斥

其实本质上就是二项式反演,只不过把组合数记进了函数里,也是至少转恰好。

\[g(0)=\sum_{i=0}^n f(i)\iff f(0)=\sum_{i=0}^n (-1)^i g(i) \]

发现其实就是二项式反演的形式4。

子集反演

子集反演是与二项式反演类似的东西,只不过反演的并不是两个一般的数列,而是对一个集合的所有子集进行。具体如下,也是有两种形式:

两种形式

设 $ f_S $ 为限制为恰好是集合 $ S $ 的答案,$ g_S $ 为限制为 $ S $ 的子集的答案,可以得到关系,根据子集反演有

\[g_S = \sum_{T \subseteq S} f_T\iff f_S = \sum_{T \subseteq S} (-1)^{|S| - |T|} g_T. \]

对称地,$ f_S $ 定义不变,$ g_S $ 为限制为 $ S $ 的超集的答案,可以得到关系式 ,根据子集反演有

\[g_S = \sum_{S \subseteq T} f_T\iff f_S = \sum_{S \subseteq T} (-1)^{|T| - |S|} g_T. \]

课件上的话

之前的容斥我们似乎只关心个数,而子集容斥则是针对每个元素互不相同的情况。

题目

看课件上/参考资料

Min-Max 容斥

Min-Max 容斥也叫最值反演。它解决的问题是:

已知一些子集的最小值信息,反过来求最大值;或者已知最大值信息,反过来求最小值。

引入

例如两个数时有

\[\max(a, b) = a + b - \min(a, b). \]

三个数时有

\[\max(a, b, c) = a + b + c - \min(a, b) - \min(a, c) - \min(b, c) + \min(a, b, c). \]

这已经很像容斥了。

式子

对非空集合 $ S $,记 \(\text{Max}(S), \quad \text{Min}(S)\) 分别表示 $ S $ 中元素的最大值和最小值。

则有

\[\text{Max}(S) = \sum_{\emptyset \neq T \subseteq S} (-1)^{|T|-1} \text{Min}(T). \]

对所有元素取相反数,也可以得到对偶形式:

\[\text{Min}(S) = \sum_{\emptyset \neq T \subseteq S} (-1)^{|T|-1} \text{Max}(T). \]

K-Max

还可以推广到第 \(k\) 大/小值。

记 \(k \text{Max}(S)\) 表示 \(S\) 中第 \(k\) 大的元素,则

\[k \text{Max}(S) = \sum_{\substack{T \subseteq S \\ |T| \geq k}} (-1)^{|T|-k} \binom{|T|-1}{k-1} \text{Min}(T). \]

当 \(k=1\) 时,

\[\binom{|T|-1}{0} = 1, \]

就退化回普通的 Min-Max 容斥。

应用

它最常见的应用场景是“所有元素都出现的期望时间”。

设 $ t_i $ 表示第 $ i $ 个元素第一次出现的时间。若想知道集合 $ S $ 中所有元素都出现的时间,也就是最后一个出现时间,即:

\[\text{Max}\{t_i : i \in S\}. \]

由 Min-Max 容斥以及期望线性性

\[E[\text{Max}(S)] = \sum_{O \neq T \subseteq S} (-1)^{|T|-1} E[\text{Min}(T)]. \]

完成转化,这里 $ \text{Min}(T) $ 表示 $ T $ 中至少一个元素出现的时间,也就是第一个的出现时间,通常比“全部出现”容易算。

trick

  1. 枚举的是具体子集 \(T\),不是只枚举大小,包括子集反演都是这样;

P5643 [PKUWC2018] 随机游走

这集在 这篇blog 亦有记载。

首先使用 \(\min-\max\) 容斥将问题转化为:对于每个点集合 \(S\),求出从点 \(x\) 出发,第一次走到 \(S\) 内点的期望时间,因为这道题有后效性,所以要用高斯消元。

设 \(f_i\) 表示 \(i\) 第一次走到 \(S\) 内点的期望时间,则有:

\[f_i=1+\sum_{is_{i,j}}{f_j\over deg_i} \ \ (i\notin S) \]

直接高斯消元,但是时间复杂度过大,使用一个常见的 trick 来进行优化——主元法:对于每一些点,选取一个主元,这样每一个点都能有主元组合起来表示,这么说非常抽象,结合具体题目:

这是在一棵树上,我们把 \(x\) 定为树根,我们以 \(f_x\) 为主元,由于是树,我们往下递推,便可把每个节点写成用 \(f_x\) 的形式。

先把前面的方程重新写成:

\[f_i=1+{1\over deg_i}(f_{fa_i}+\sum_{j\in son_i}f_j) \\ \Rightarrow f_i={1\over deg_i}f_{fa_i}+1+{1\over deg_i}\sum_{j\in son_i}f_j \]

设 \(f[i]=k[i]f[fa[i]]+b[i]\),则有

\[f[i] = \frac{1}{\text{deg}[i]} f[fa[i]] + 1 + \frac{1}{\text{deg}[i]} \sum_{j \in \text{son}_i} (k[j]f[i] + b[j]) \]

\[\Rightarrow \left(1 - \frac{1}{\text{deg}[i]} \sum_{j \in \text{son}_i} k[j]\right) f[i] = \frac{1}{\text{deg}[i]} f[fa[i]] + 1 + \frac{1}{\text{deg}[i]} \sum_{j \in \text{son}_i} b[j] \]

\[\Rightarrow f[i] = \frac{f[fa[i]] + \text{deg}[i] + \sum_{j \in \text{son}_i} b[j]}{\text{deg}[i] - \sum_{j \in \text{son}_i} k[j]} \]

因此有

\[k[i] = \frac{1}{\deg[i] - \sum_{j \in \text{son}_i} k[j]} \]

\[b[i] = \frac{\deg[i] + \sum_{j \in \text{son}_i} b[j]}{\deg[i] - \sum_{j \in \text{son}_i} k[j]} \]

以上都是对于 \(i\notin S\),\(\forall i\in S,k[i]=b[i]=0\)

发现改写后的方程 \(k[i],b[i]\) 都是定值,可以从下往上 dp 了。

最后在 \(x\) 位置,由于 \(f[fa[x]]=0\),所以 \(k[x]=0\),\(f[x]=b[x]\)。

获得 \(f[x]\) 的值后,可以利用已求出的 \(k, b\) 的值,从上往下递推获得所有其他的 \(f\) 值。

单次 dp 复杂度 \(O(n)\),总时间复杂度 \(O(2^n n)\)。可以尝试加入卷积,会更优,具体看题解区。

点减边容斥

\[连通块数量=点数-边数 \]

对于求连通块的方案可以转化成求点的方案和求边的方案。

这个容斥需要巨大补充,还要搜些博客来看。

未知题目

题目大意:

给定一棵 \(n\) 个节点的树,点和边均有编号。

\(q\) 次询问,每次给定 \(l,r\),请你求出保留编号在 \([l,r]\) 之间的点和边之后,形成的图的连通块个数。

\(n,q\le 10^6\),要求单 \(\log\)。

未知题目

题目大意

给定一棵 \(n\) 个节点的树,以及树的 \(m\) 条路径 \(s_i,t_i\)。

定义一个非空集合 \(S\subset {1,2,\cdots,m}\) 的是好的,当且仅当存在一个节点 \(x\),使得对于 \(i\in S\),\((s_i,t_i)\) 都经过 \(x\)。

请你求出有多少个集合是好的。

\(n,m\le 10^7\),要求 \(O(n+m)\)。

题解

注意到,如果 \(S\) 是好的,那么对于 \(i\in S\),\((s_i,t_i)\) 的交集是一个连通块。特别的,这个连通块是一条链。

考虑点减边容斥。具体来说,\([S{是好的}]=num1-num2\),其中 \(num1\) 是满足 \(i \in S\) 的 \((s_i,t_i)\) 点集的交集的大小;\(num2\) 是边集的交集的大小。

分别统计 \(\sum num1\) 和 \(\sum num2\)。由于计算方法类似,我们只考虑 \(\sum num1\)。

考虑每个点对答案的贡献。若经过 \(u\) 的路径数为 \(f_d\),则 \(\sum num1=\sum \left(2^{f_d}-1\right)\)。而 \(f_d\) 可以用树形差分简单的求出。时间复杂度为 \(O(n+m)\)。

互不相等容斥

引入

考虑这样一类计数问题:

有 $ n $ 个变量 $ a_1, a_2, \dots, a_n $,每个 $ a_i $ 有自己的可选集合 $ S_i $,要求

\[a_i \in S_i, \quad a_i \neq a_j \quad (i \neq j). \]

解法

直接处理“两两不相等”通常很麻烦。

反过来考虑相等关系:在点集 \(\{1, 2, \dots, n\}\) 上建图,若钦定 \(a_i = a_j\),就连一条边 \((i, j)\)。

那么一个连通块内部的所有变量都会被强制相等,我们只需要考虑这里面连通块里 点是什么,不考虑边具体选了哪些的。也就是说连通块是由点集唯一确定的,而可能不同的边集可以确定同一个点集,也就是一个连通块(要梳理清楚这里,否则后面会乱)。

对边集 $ E $,记 $ C(E) $ 表示图 $ (V, E) $ 的连通块划分。

用容斥排除所有相等事件。

设 $ F(P) $ 表示:按照划分 $ P $,每个块内部变量都相等时的方案数。

则答案为

\[ans = \sum_E (-1)^{|E|} F(C(E)). \]

按连通块划分 $ P $ 合并同类项:

\[ans = \sum_P F(P) \sum_{C(E) = P} (-1)^{|E|}. \]

关键变成计算后面这个容斥系数。

对于一个大小为 \(k\) 的块,记

\[g_k = \sum_{(V,E) \text{ 连通}} (-1)^{|E|}. \]

设任意边集的带符号和为(不考虑是否连通,\(U\) 为全边集):

\[f_k=\sum_{E}(-1)^{|E|}=\sum_{E\subseteq U}(-1)^{|E|}1^{|U|-|E|}=(1-1)^{|U|}=(1-1)^{k\choose 2} \]

所以,当 \(k\ge 2\),\(f_k=0\),否则为 \(1\),容斥有:

\[g_k=f_k-\sum_{(V,E)不连通} (-1)^{|E|} \]

这样比较难处理,假设当前连通块包含 1 号点,枚举 1 号点所在的连通块,因为其他情况也是对称的:

\[\begin{align*} g_k&=f_k-\sum_{1\in S,|S|<k} g_{|S|}\cdot f_{k-|S|}\\ &=f_k-\sum_{1\in S,|S|=k-1} g_{|S|}\\ &=f_k-g_{k-1}\sum_{1\in S,|S|=k-1}1\\ &=f_k-g_{k-1}(k-1) \end{align*} \iff f_k=g_k+(k-1)g_{k-1}=0(k>1) \]

结合 \(g_1=1\),得到:

\[g_k=(-1)^{k-1}(k-1)! \]

因为不同连通块之间互相独立,所以划分 $ P $ 的系数为

\[\sum_{C(E) = P} (-1)^{|E|}=\prod_{B \in P} (-1)^{|B|-1} (|B| - 1)!. \]

最终得到公式:

\[ans = \sum_P F(P) \prod_{B \in P} (-1)^{|B|-1} (|B| - 1)!. \]

应用

  • 先想清楚“若某些变量被强制相等”,方案数 $ F(P) $ 怎么算;
  • 再把每个块乘上系数 $ (-1)^{|B|-1} (|B| - 1)! $;
  • 最后对所有划分求和,或者用集合幂级数/快压 DP 加速。
posted @ 2026-10-20 21:17  lcx_OIer  阅读(7)  评论(0)    收藏  举报