容斥、反演学习笔记
下面将会是各种反演、容斥
二项式定理
一般形式:
广义二项式定理:
下面会用到的组合恒等式
至少与恰好
在计数题中,所谓“至少”经常不是朴素地限制数量至少为 \(k\)。
更常见的是钦定了 \(k\) 个性质必须满足;剩下的性质不作限制。
至少和恰好可以相互转化,应用二项式反演。
二项式反演
四种形式
\(g(i)\) 表示至少/至多 \(i\) 个,\(f(i)\) 表示恰好 \(i\) 个,这样就可以实现至少/至多和恰好的转化。
二项式反演的常见形式主要有以下4种:
形式一:
形式二:
形式三:
形式四(最常用):
如何应用
以形式二为例,\(g(i)\) 表示至少 \(i\) 个,\(f(i)\) 表示恰好 \(i\) 个。这样就可以实现至少和恰好的转化。
基础容斥
其实本质上就是二项式反演,只不过把组合数记进了函数里,也是至少转恰好。
发现其实就是二项式反演的形式4。
子集反演
子集反演是与二项式反演类似的东西,只不过反演的并不是两个一般的数列,而是对一个集合的所有子集进行。具体如下,也是有两种形式:
两种形式
设 $ f_S $ 为限制为恰好是集合 $ S $ 的答案,$ g_S $ 为限制为 $ S $ 的子集的答案,可以得到关系,根据子集反演有
对称地,$ f_S $ 定义不变,$ g_S $ 为限制为 $ S $ 的超集的答案,可以得到关系式 ,根据子集反演有
课件上的话
之前的容斥我们似乎只关心个数,而子集容斥则是针对每个元素互不相同的情况。
题目
看课件上/参考资料
Min-Max 容斥
Min-Max 容斥也叫最值反演。它解决的问题是:
已知一些子集的最小值信息,反过来求最大值;或者已知最大值信息,反过来求最小值。
引入
例如两个数时有
三个数时有
这已经很像容斥了。
式子
对非空集合 $ S $,记 \(\text{Max}(S), \quad \text{Min}(S)\) 分别表示 $ S $ 中元素的最大值和最小值。
则有
对所有元素取相反数,也可以得到对偶形式:
K-Max
还可以推广到第 \(k\) 大/小值。
记 \(k \text{Max}(S)\) 表示 \(S\) 中第 \(k\) 大的元素,则
当 \(k=1\) 时,
就退化回普通的 Min-Max 容斥。
应用
它最常见的应用场景是“所有元素都出现的期望时间”。
设 $ t_i $ 表示第 $ i $ 个元素第一次出现的时间。若想知道集合 $ S $ 中所有元素都出现的时间,也就是最后一个出现时间,即:
由 Min-Max 容斥以及期望线性性
完成转化,这里 $ \text{Min}(T) $ 表示 $ T $ 中至少一个元素出现的时间,也就是第一个的出现时间,通常比“全部出现”容易算。
trick
- 枚举的是具体子集 \(T\),不是只枚举大小,包括子集反演都是这样;
P5643 [PKUWC2018] 随机游走
这集在 这篇blog 亦有记载。
首先使用 \(\min-\max\) 容斥将问题转化为:对于每个点集合 \(S\),求出从点 \(x\) 出发,第一次走到 \(S\) 内点的期望时间,因为这道题有后效性,所以要用高斯消元。
设 \(f_i\) 表示 \(i\) 第一次走到 \(S\) 内点的期望时间,则有:
直接高斯消元,但是时间复杂度过大,使用一个常见的 trick 来进行优化——主元法:对于每一些点,选取一个主元,这样每一个点都能有主元组合起来表示,这么说非常抽象,结合具体题目:
这是在一棵树上,我们把 \(x\) 定为树根,我们以 \(f_x\) 为主元,由于是树,我们往下递推,便可把每个节点写成用 \(f_x\) 的形式。
先把前面的方程重新写成:
设 \(f[i]=k[i]f[fa[i]]+b[i]\),则有
因此有
以上都是对于 \(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 $,要求
解法
直接处理“两两不相等”通常很麻烦。
反过来考虑相等关系:在点集 \(\{1, 2, \dots, n\}\) 上建图,若钦定 \(a_i = a_j\),就连一条边 \((i, j)\)。
那么一个连通块内部的所有变量都会被强制相等,我们只需要考虑这里面连通块里 点是什么,不考虑边具体选了哪些的。也就是说连通块是由点集唯一确定的,而可能不同的边集可以确定同一个点集,也就是一个连通块(要梳理清楚这里,否则后面会乱)。
对边集 $ E $,记 $ C(E) $ 表示图 $ (V, E) $ 的连通块划分。
用容斥排除所有相等事件。
设 $ F(P) $ 表示:按照划分 $ P $,每个块内部变量都相等时的方案数。
则答案为
按连通块划分 $ P $ 合并同类项:
关键变成计算后面这个容斥系数。
对于一个大小为 \(k\) 的块,记
设任意边集的带符号和为(不考虑是否连通,\(U\) 为全边集):
所以,当 \(k\ge 2\),\(f_k=0\),否则为 \(1\),容斥有:
这样比较难处理,假设当前连通块包含 1 号点,枚举 1 号点所在的连通块,因为其他情况也是对称的:
结合 \(g_1=1\),得到:
因为不同连通块之间互相独立,所以划分 $ P $ 的系数为
最终得到公式:
应用
- 先想清楚“若某些变量被强制相等”,方案数 $ F(P) $ 怎么算;
- 再把每个块乘上系数 $ (-1)^{|B|-1} (|B| - 1)! $;
- 最后对所有划分求和,或者用集合幂级数/快压 DP 加速。

浙公网安备 33010602011771号