容斥与反演 笔记
常见容斥:
- 子集反演
- 二项式反演
- min-max 容斥
- 斯特林反演
其中 \(\left[\begin{matrix}n\\m\end{matrix}\right]\) 表示在 \(n\) 个数中选出 \(m\) 组圆排列的方案数,\(\left\{\begin{matrix}n\\m\end{matrix}\right\}\) 表示 \(n\) 个有标号球放到 \(m\) 个无标号盒子里的方案数。
斯特林数递推公式:
- 单位根反演
P4859
因为药片和糖果的能量互不相同,所以问题转化为恰好有 \(k'=\frac {n+k} 2\) 对组合满足 \(a_i>b_{p_i}\)。
像这种关于大小关系的计数问题一般可以先对两个序列进行排序。
对于一个 \(a_i\),考虑将其与某个 \(b_j\) 配对。有以下两种情况:
- \(b_j<a_i\) 因为 \(a_i\) 递增,可以记录前面的 \(a_x\) 选了多少个 \(b_j<a_x\)。能够与 \(a_i\) 组合的 \(b_j\) 个数是好算的,这部分可以考虑 \(dp_{i,j}\) 表示前 \(i\) 个数,选了 \(j\) 个的方案数。有转移 \(dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}\times\max(0,cnt_i-j+1)\)。
- \(b_j>a_i\) 这部分不好算,因为当前的选择具有后效性,所以我们先不填,最后再考虑。
“恰好”的问题不好做,考虑把它弱化为“至少”,然后用二项式反演消除影响。
我们令 \(g_i\) 表示至少有 \(i\) 对的答案。所以 \(g_i=dp_{n,i}\times(n-i)!\),即保证了有 \(i\) 对组合的方案数为 \(dp_{n,i}\),剩下随意乱填的方案数为 \((n-i)!\),乘在一起就是答案。
我们令 \(f_i\) 表示恰好有 \(i\) 对的答案。假设我们求出了 \(f_i\),可以发现 \(f_i\) 对 \(g_j(j\le i)\) 的贡献是 \(f\) 中的 \(i\) 对在被 \(g\) 中被钦定的 \(j\) 对中出现的次数,也即 \(\binom i j\)。
那么有
二项式反演得到
预处理组合数,然后跑 \(O(n^2)\) dp,最后合并答案,时间复杂度为 \(O(n^2)\)。
bzoj4361
题意简述:给定一个长度为 \(n\le 2000\) 的序列 \(a\),如果 \(a\) 不是非降的,就选出 \(a\) 中一个元素删掉,否则停止。问有多少种不同的操作方案,操作方案不同当且仅当操作顺序或操作次数不同。
考虑枚举整个序列剩下什么东西。令 \(f_i\) 表示长度为 \(i\) 的非降子序列个数。这个可以用BIT优化dp做到 \(O(n^2\log n)\)。那么有一个初步的答案为 \(\sum f_i\times i\times(n-i)!\)。
但是这样有一个问题:我们可能删到某个时刻就已经满足 \(a\) 非降,此时我们多算了若干步。只要减掉这多余的部分即可。
考虑最后一步删了什么元素,也就是统计不删这个元素这个序列已经非降的情况数。假设当前的序列长度为 \(l\),那么上一步剩下的序列长度为 \(l+1\),非降,此时有 \(l+1\) 中不合法的删除情况,总共需要减去 \(f_{l+1}\times(l+1)\times (n-l-1)!\) 种情况。
所以我们的最终答案为:
P4707
好题。
这道题和P3175有一定相似度。我们套路地令 \(x_i\) 表示第 \(i\) 中原料的出现时间,那么答案即为 \(E(\min_k x_i)\)。
根据出题心理学,这个东西肯定不好求,但是我们可以通过 min-max 容斥将 \(k\) 去掉。
发现 \(E(\min_{i\in T} x_i)=\dfrac m {\sum_{i\in T} p_i}\) 是好求的,所以我们可以先将 \(k'\leftarrow n-k+1\) 转化为求 \(E(\max_k x_i)\)。
先把拓展 min-max 容斥式子写下来:
将这个 \(\min\) 拆开,套一层期望得到:
注意到 \(m\) 是不变的,前面那一坨式子只和 \(T\) 与 \(\sum p_i\) 有关,所以有一个很naive的dp设计:令 \(dp_{i,j,siz}\) 表示考虑到前 \(i\) 个数,选了 \(siz\) 个数,它们和为 \(j\) 的方案数,转移显然。但是这种方法是 \(O(n^2m)\) 的,无法通过。
所以这里有一个非常巧妙的思路:我们需要少枚举一些东西!
如果不管 \(\sum p_i\),那么我们需要求出所有可能情况的 \(p\) 的倒数和。我们发现这个倒数在新加入元素时非常令人难受,遂放弃。
如果不管 \(|T|\),那么就需要考虑当 \(|T|\leftarrow |T|+1\) 时的事情:
这个好像是可以进行dp的。注意到这个式子中第二项里的 \(k\) 变成了 \(k-1\),所以还需要在 \(dp\) 中记录当前的 \(k\) 值。令 \(dp_{i,j,t}\) 表示在 \(k=t\) 且 \(\sum p_i=j\) 时,所有 \((-1)^{|T|-k}\binom{|T|-1}{k-1}\) 的和。
根据前面推得式子,转移是比较简单的:
至于边界条件,让 \(dp_{0,0,0}=1\) ,其余数组都设置为 \(0\) 即可。当然这题的空间比较紧,所以需要用滚动数组把 \(i\) 滚掉。代码反而更简洁了
P5643
套路min-max容斥,考虑 \(dp_{i,S}\) 表示从 \(i\) 出发走到 \(S\) 中任何一个点的期望步数。
那么有:
这个dp具有很强的后效性,似乎需要高斯消元。但是!树上随机游走问题可以通过将儿子的dp值设为关于父亲dp值的函数来避免高斯消元!
考虑令 \(dp_{i,S}=A_i\times dp_{fa_i,S}+B_i\),那么因为根节点没有父亲,所以 \(dp_x=B_x\)。
修改一下式子:
整理系数可得:
根据 min-max 容斥,有
这是一个或卷积的形式,FWT整上去就做完了。
ARC101C
首先我们发现,钦定某些边强行不选可能是简单的。
考虑 \(f(S)\) 为钦定 \(S\) 中的边没有被染色的方案数,答案即为 \(\sum_{S\subseteq E} (-1)^{|S|}f(S)\)。
考虑令 \(h(x)\) 表示 \(x\) 个点随便匹配的方案数。那么有
\(f(S)\) 的值可以认为是 \(S\) 将树分成的若干连通块的 \(g(siz)\) 之积。
考虑dp。因为 \(f(S)\) 与连通块大小有关,所以我们令 \(dp_{u,j}\) 表示 \(u\) 子树中,与 \(u\) 相连的点的个数为 \(j\) ,忽略包含 \(u\) 的连通块时对答案的贡献。那么可以列出转移:
用 \(O(n^2)\) 的树形dp即可。
[2018雅礼集训1-16]方阵
题意:给出一个 \(n\times m\) 的矩形,每个位置上填上 \([1,c]\) 中任意一个正整数。要求填好后任意两行任意两列不等价。求方案数。
我们注意到如果只限制行不等价是好做的:\(f(n,m)\) 表示答案,那么有:
考虑加上列的限制:\(g(n,m)\) 表示答案,那么考虑枚举等价类的个数,有递推式:
由斯特林反演,得到
时间复杂度 \(O(n^2)\)。
BZOJ4671
题意:定义两个图的异或图为这两个图的邻接矩阵每个位置分别异或得到的新矩阵对应的图。现在给定大小为 \(m\le 60\) 的 \(n\le 10\) 个顶点的无向图集合,问有多少个子集的异或图为连通图。
好题!
我们发现如果钦定了某些节点不能放在一起,那么方案数可能是好求的。
考虑将 \(n\) 个点划分为 \(k\) 个集合,集合内的点随便连,集合间的点不能连,那么这样我们得到了至少 \(k\) 个连通块。
考虑“至少”与“恰好”的转化:令 \(f_k\) 表示至少 \(k\) 个连通块的方案数,\(g_k\) 表示恰好 \(k\) 个连通块的方案数。\(g_i\) 中所钦定的连通块在 \(f_k\) 中可能会再一次被合并,所以 \(g_i\) 对 \(f_k\) 的贡献为 \(\left\{\begin{matrix}i\\x\end{matrix}\right\}\),于是有
反演得到
考虑计算 \(f\)。我们枚举每一种划分情况,那么相对应地会出现若干限制:每种限制要求一条边的出现次数为偶数。
我们将“限制边”的出现情况压成一个二进制数,那么问题转化为:有多少个集合满足集合内所有数的异或和为0?
这是线性基板子题,将所有东西插入线性基里,假设此时线性基里有 \(s\) 个数,那么答案即为 \(2^{n-s}\)。
【总结】关于容斥类题目,我们一般去考虑求哪些问题/破坏哪些条件是简单的,再找到弱化版的问题和原问题之间的关系。对于弱化版的问题,我们一般是去将讨论的元素分为两类:满足要求的元素,和随便乱来的元素。一般到这一步就可以暴力枚举或者用dp优化解决问题。

浙公网安备 33010602011771号