9. 容斥与反演
9.容斥与反演
容斥原理:
感性理解: \(P_i\):”满足某种性质的元素的集合“;左边:具有任意一种性质的元素的并,右边:至少具备多个性质的元素。
证明:考虑一个元素 \(x\),设其包含在 \(k\) 个集合内,那么当集合 \(|s|=t\) 时,会被算 \(\binom{k}{t}\) 次,其系数为 \((-1)^{t-1}\),整理:
不定方程计数
有不定方程 \(\sum x_i=S\),均为非负整数,有限制 \(x_i\le k\),求解数。\(n,k\le 10^5\)。
- 不好直接做,考虑容斥。
- 枚举几个至少大于 \(k\),\(S\) 则变成 \(S-(k+1)\times i\),问题转化为没有限制的问题,运用插板法解决。
多重集的错位排列
给定非排列的 \(a_i\),求有多少种改变顺序得到的 \(b_i\) ,满足 \(\forall \ b_i\ne a_i\) 。\(n\le2000\) 。
普通错排的递推式就是 \(D(n)=(n-1)\times (D(n-1)+D(n-2))\) ,就是考虑最后一步,是交换之前的一个错排,还是之前的一个非错排。
但是错排还有容斥形式,至少一个的容斥系数就是:(固定零个)-(固定一个)+ (固定两个)-(固定三个)+(固定四个)...
即:(刚好打破 \(0\) 个限制)=(至少打破 0 个限制)-(至少打破 1 个限制) + (至少打破两个限制) - (至少打破三个限制)...
写成封闭形式,即 \(D(n)=\sum (\binom{n}{i}(-1)^i\times(n-i)!)\)
回顾一下容斥原理的本质:容斥系数为正的时候,是为了求出那些最后一次有机会能求出的数。
另外,对于多重集的全排列公式,即 \(\frac{n!}{n_1!n_2!n_3!...n_k!}\) 。
考虑 \(dp\) ,设 \(f[i][j]\) 表示考虑了 \(i\) 个数字,\(j\) 个位置强制打破。数组值存的是 容斥系数×方案数。
枚举当前数字 \(i\) 强制打破了 \(k\) 个限制, $f[i][j]=\sum f[i-1][j-k]\times (-1)^k\times \binom{siz[i]}{k}\times \frac{1}{(siz[i]-k)!} $ ,和上面基本一样。
最后答案即 \(\sum f[m][i] \times (n-j)!\) 。
[JSOI2015] 染色问题
给你一个 \(n\times m\) 的网格和 \(c\) 种颜色,要求每行,每列至少染色一个,\(c\) 种颜色必须全用。\(n,m,c\le 400\)。
发现有三层限制,我们至少要容斥掉两层。
设 \(f(c)\) 为至多使用 \(c\) 种颜色的方案数,则 \(ans=\sum(-1)^{c-i}\binom{c}{i}f(i)\)。
再容斥一维,看哪些列全为 \(0\)。
[ZJOI2016] 小星星
给你一个无向图,再给你一个 \(n\) 个点的树,问有多少给点重编号的方式,使得树上的边均存在于原图中。
\(n\le17,m\le \binom{n}{2}\)。
不容易想到 \(O(n^33^n)\) 的树形 DP,设 \(f[i][j][S]\) 表示将 \(i\) 重标号为 \(j\),遍历 \(j\) 在图上连的点 \(y\) 是相连的。
转移方程:
考虑我们为什么要存一个子集,是为了保证重标号的结果是一个排列,也即不重不漏,怎么计数?容斥!
枚举一个 \(S\),设 \(g(S)\) 表示只考虑 \(S\) 内的编号,也即:至多选择这些点。运用子集反演,则答案为 \(\sum (-1)^{n-|S|}g(S)\)。
[TJOI2019] 唱、跳、rap和篮球
给定 \(a,b,c,d\) 个唱跳rap篮球,将他们放在长度为 \(n\) 的序列中,求有多少方案满足不存在相邻的唱跳rap篮球。相同类型彼此不区分。\(n\le1000,a,b,c,d\le 500,a+b+c+d\ge n\)。时间限制 \(4s\)。
很套路的容斥,我们钦定有 \(i\) 个相邻的,那么答案就是 \(\sum_{i}(-1)^{i}f(i)\)。
因为 \(n\) 和种类数都较小,所以我们可以直接 dp求出 \(f(i)\):设 \(g_{i,j,c}\) 表示前 \(i\) 种颜色放了 \(j\) 个,钦定了 \(c\) 个位置,再往里插板即可。
一个比较关键的是:钦定 \(i\) 个长度为 \(4\) 的子段的方案数是多少?答案是 \(\binom{n-3i}{i}\),貌似高中数学称为捆绑法(我只听过一节)?
因此答案即为 \(\sum_{i}\binom{n-3i}{i}(-1)^{i}g(n,j,n-4c)\)。
[AHOI2018初中组] 球球的排列
给定序列,求有多少种排列方式,使得没有相邻两个数的乘积是完全平方数。\(n\le 300,a_i\le 10^9\)。
首先易得关键性质:若 \(ab=x,bc=y\) 为完全平方数,则 \(ac\) 同样也是。证明:\(ac=\frac{xy}{b^2}\) 显然是整数,且是完全平方数。
于是题意可以转换为:
有 \(m\) 种颜色的球,第 \(i\) 种的颜色有 \(s_i\) 个,\(\sum s_i=n\),求同色不相邻的方案,球有编号。
真的是组合计数困难题呀,想了一天的式子,中间牵扯到多重集全排列以及交换求和顺序等等知识点。
O(n^3) dp做法:
- 设 \(f[i][]\)
O(n^2) 容斥做法:
-
我们可以 钦定 对于前 \(i\) 种颜色,总共有 \(j\) 个相邻,当前颜色有 \(k\) 个相邻,这样的情况有多少?
-
设 \(f_i\) 表示总共有 \(i\) 个相邻。
容斥在什么时候起效?
- \(=\) 或 \(\ne\)
- \(\min\) 或 \(\max\)
- 至少 或 恰好
二项式反演
实际上,反演在线性代数上的本质相当于矩阵乘法,即为,有两个向量 \(F,G\),转移矩阵 \(H\),有
\[F=G\times H \]如果 \(H\) 存在逆 \(H^{-1}\),则有:
\[G=F\times H^{-1} \]问题转化为了构造矩阵以及求矩阵逆元。
由此本质出发,矩阵自身进行一些转置什么的操作,依旧满足性质。
定理内容:
若
则有:
证明:使用vfk原ppt方法
我们依旧回到错排问题,设 \(f(n)\) 表示错排方案数,\(g(n)\) 表示随便放,则 \(g\) 可以写成关于 \(f\) 的形式:
即为枚举哪些人站错了,剩下的人都站对了。
考虑一个显然正确的式子:
对于艾佛森括号,我们可以通过二项式定理展开,即:
再次代入:
其中有两个组合数,考虑组合意义:先在 \(n\) 种选 \(m\) 个,再从剩下的选 \(i\) 个,先后顺序是不重要的,所以有:
交换求和符号:
不难发现后面的式子即为 \(g(n-i)\):
令 \(t=n-i\),则 \(i=n-t\)。
证毕。
“至多/至少"和"恰好"的转换
考虑组合意义,上式的 \(g(i)\) 表示 至多i,下式表示 至少 i。右侧 \(f\) 均表示恰好 \(i\)。
应用在于算容斥系数。
例题1:P4859 已经没有什么好害怕的了
给定两个序列,\(a_i,b_i\),要求两两配对使得 \(a_j>b_k\) 的配对数减去 \(a_j<b_k\) 的配对数恰好等于 \(t\),求方案数。\(t\le n\le 2000\)。保证 \(a,b\) 互不相同。
因为没有相等的元素,所以 \(a>b\) 的个数一定是 \(\frac{n+k}{2}\)。特判掉 \(n+k\) 为奇数的情况。
问题变成了计数 \(a>b\) 恰好为 \(k'\) 的方案。
我们肯定需要分别升序排序,然后考虑 \(a_i\) 匹配了哪个位置上的 \(b_j\)。
设 \(f_{i,j}\) 表示考虑 \(a\) 的前 \(i\) 个位置已经匹配,此时比 \(a_i\) 小的 \(b\) 还有 \(j\) 个:
如果当前 \(a_i\) 匹配了一个小于 \(a_i\) 的 \(b\),那么下一个 \(a_{i+1}\) 会减少一个能够匹配的 \(j\)。
但是如果匹配了一个大于 \(a_i\) 的 \(b\),下一个 \(a_{i+1}\) 不好确定是否会减少,这样看似只能状压,如何刻画?
考虑反演。我们要计算 恰好有 k 对匹配,通过二项式反演,我们也可以求 至少有 k 对匹配。
设 \(f_{i,j}\) 表示至少匹配了 \(j\) 次 \(<a\) 的匹配,那么每次要么不匹配,匹配的方案有 \(s-j\) 种,其中 \(s\) 是小于 \(a_i\) 的 \(b\) 的个数。
设 \(g_i\) 表示至少 \(i\) 对匹配,有 \(g_i=\sum (n-i)!f_{n,i}\),前面的阶乘表示剩下的随便乱选。
然后对于恰好的转换就是:\(ans=\sum_{i=k}^n(-1)^{i-k}\binom{i}{k}g(i)\)。
降智错误:最后的 k,实际上是 (n+k)/2!!!
子集反演
定理内容
若
则有:
证明
类似的,我们可以反演艾佛森括号:
等价于二项式反演,因为元素大小为 \(|T|\) 的元素有 \(\binom{|S|}{|T|}\) 个。
P6442 [COCI2011-2012#6] KOŠARE
给定 \(n\) 个箱子,每个箱子中有若干件物品,所有物品的种类数 \(m\le 20\),求选择箱子的方案数,使得每种物品都被包含。\(n\le 10^6\)。
直接做不好做,显然用子集反演,但是是选择“至少”还是“至多”呢?
我们考虑 \(f[S]\) 表示选的物品是 \(S\) 的子集的方案数,\(ans=\sum_{T\sub 2^m}(-1)^{m-|T|}f[T]\) 。
再求出 \(g[S]\) 表示有多少箱子是 \(S\) 的子集,\(f[S]=(2^{g[S]}-1)\)。
可以发现 \(g[S]\) 相当于高维前缀和。
[ARC101E] Ribbons on Tree
给定大小为 \(n\) 的树,给树上的点两两配对,对于每一组配对 \((u,v)\) 将其路径上的边全部覆盖,定义一个配对方案合法,当且仅当每一条边都被覆盖。\(n\le 5000\) 且是偶数。
套路的,有 \(O(n^3)\) 的 DP:
设 \(f_{u,i}\) 表示 \(u\) 为根的子树内有 \(i\) 个点未匹配的方案数,转移用 \(f_{u,i}\times f_{v,j}\times \binom{i}{k}\binom{j}{k}\to f_{u,i+j-k}\) 。
这样没有优化的空间了,考虑子集反演(容斥):
P3813 [FJOI2017] 矩阵填数
给定一个 \(h\times w\) 的矩阵,每个位置可以填 \([1,m]\) 的数。
有 \(n\) 个限制:表示一个子矩阵的最大值为 \(v\)。
求方案数。\(h,w,m\le 10^4,n\le 10\)。
对于多个矩形,满足条件是不好做的,但是不满足条件是好做的,只需要 \(s^{v}-s^{v-1}\) 即可,其中 \(s\) 是这个矩形的点个数。
设 \(f(S)\) 表示至少打破 \(S\) 集合内的限制,最终求恰好打破 \(0\) 个限制,直接子集反演。
因为 \(n\) 只有 \(10\),我们可以先离散化,这样有用的点就是 \(O(n)\) 个了。
这样暴力遍历矩形并 checkmin
,可以在 \(O(n^3)\) 求出 \(f(S)\)。
时间复杂度 \(O(2^nn^3)\)。
当走不动的时候多想想离散化,NOIP2023T4说不定就拿满了。
这里二维矩形的离散化来整理一下,两种思路:
-
每个点保存以其为右上角的矩形,放在一维上存的是 \((x_{i-1},x_i]\) 左开右闭,注意到这样可以充分利用 \(x[0]=0\),但仍要加入 \(x[n+1]=h\)。
对于输入矩形 \((x_1,y_1,x_2,y_2)\),因为左开右闭,所以实际上存的是 \((x_1-1,y_1-1,x_2,y_2)\),进行遍历的时候,实际上是:
for(int x=q[j].x1+1;x<=q[j].x2;x++) { for(int y=q[j].y1+1;y<=q[j].y2;y++) { a[x][y]=min(a[x][y],q[j].v-1); } } for(int x=1;x<=tot1;x++) { for(int y=1;y<=tot2;y++) { int s=(X[x]-X[x-1])*(Y[y]-Y[y-1]); ans=ans*ksm(a[x][y]%mod,s)%mod; } }
-
每个点保存以其为左下角的矩形,放在一维上是左闭右开,这样需要加入 \(x[1]=1,x[n+1]=h+1\)。
对于输入矩形,其右上角要加一,遍历的时候只能到右端点减一。
都可以先从一维上考虑,理清思路再写,检查考场上会写慌。
[SHOI2016] 黑暗前的幻想乡
有一张无向完全图,每条边有一个颜色,总共有 \(n-1\) 种颜色,求恰好有 \(n-1\) 种颜色的生成树个数。\(n\le 17\)。
这题也非常牛!
如果已知一个无向图,那么我们很好用矩阵数定理求生成树个数。
但是颜色的限定很制,限制表示一个颜色只能选一条边,我们枚举选的颜色集合,表示至多打破这些颜色的限制,形成的生成树个数,最终要求的是恰好打破 0 个颜色限制的个数。子集反演即可。
Min-max 容斥
定理内容
证明
对于每一个 \(a_i\in T\),考虑其作为最小值的贡献次数,显然,小于 \(a_i\) 的不能选,不妨设大于 \(a_i\) 的有 \(k\) 个,枚举,则有:
由二项式反演易知其结果为 \([k=0]\),即只有最大值能有贡献。
期望形式
扩展形式
P3175 [HAOI2015] 按位或
初始手上有一个 \(0\),每一秒你可以选择一个 \([0,2^n-1]\) 的数字与手上的数字进行按位或,选择 \(i\) 的概率是 \(p_i\),问期望多少秒后手上的数字变成 \(2^n-1\)。\(n\le 20\)。
前置知识:离散随机变量的几何分布
这是高中数学吗?
抛出一个六面的筛子,丢出数字 \(1\) 的期望是多少?答案即为 \(1/(1/6)=6\)。
证明:
\[E(x)=\sum_{i=1}^\inf i\cdot P(x=i) \\ E(x)=\sum_{i=1}^{\inf}P(x\ge i) \\ E(x)=\sum_{i=1}^\inf (1-p)^{i-1} \\ E(x)=\sum_{i=0}^\inf (1-p)^i=\frac{1-(1-p)^{\inf}}{1-(1-p)}=\frac{1}{p} \]
我们把 \(n\) 为二进制直接看成集合,定义集合的 \(\max\) 为集合中最后一个位置变成 1 的时间,定义 \(\min\) 为集合中第一个位置变成 1 的时间。这样做的原因是第一个位置变成 1 是好求的。
注意我们求概率 \(p\) 的时候就已经不关心试了几次了,只用求一次的情况。
因此,我们只需计算一遍高维前缀和即可,如果最后要求任意结束位置,则需要求两遍高维前缀和。
P4707 重返现世
[PKUWC2018]随机游走
有根树,初始给定起点。每次询问树上随机游走经过一个点集中所有点至少一次的期望步数。 \(n\le 18\)。
相当于求集合最后一个点经过的时间,可以用Min-Max容斥转换为求第一个点经过的时间。
根据期望的套路,可以直接dp,设 \(f_{i,s}\) 表示从 \(i\) 出发,第一次走过 \(s\) 内任意一个点的期望时间,有转移:
需要高斯消元,时间复杂度 \(O(n^33^n)\)。
对于树上需要高斯消元的问题,如果我们将转移方程写成关于父亲的函数,那么可以在 O(n) 时间做树上高消。
具体的,设 \(f_i=A_if_{fa[i]}+B_i\),则转移方程可以写成:
非常牛,\(A,B\) 均只与子树信息有关,同时和 \(S\) 无关,可以直接一遍树形 dp 得到。
错误的,不要忘了 \(S\) 的限制,当 \(x\in S\) 的时候直接 return
即可。