详细揭秘:详细揭秘:集合划分容斥的容斥系数
详细揭秘:详细揭秘:集合划分容斥的容斥系数
宝宝都会的集合划分容斥,从多项式角度推导容斥系数
参考文献:
容斥系数简单来说就是当我们产生贡献的集合里面有 极大 等限制词语时用来拆掉这个限制所人为构造的一组系数
我们现在有两种算法
- 保证所有贡献集合都满足 极大
- 丢掉 极大 的限制
我们希望在 2 的做法中加入容斥系数使得答案和 1 算出来一样
设当前等价类合并(不限制极大的元素合并成极大的元素)的函数为 \(G\),而在 1 中的极大集合的贡献系数是 \(F\)
那么我们构造的函数 \(H\) 满足 \(G(H(x))=F(x)\) 答案就正确了
原因就是你把所有的 \(H\) 拼起来等于它应该的系数,和正常容斥一个道理
序列上使用例
00-avoiding 序列
首先划分等价类,找到我们要容斥的东西,肯定是要对 \(0\) 的长度进行容斥
那么有 \(F(x)=x,G(x)=\dfrac{1}{1-x}-1\)
可以发现最终 \(H(x)=\dfrac{x}{1+x}\)
那么就可以直接做了,答案的生成函数是 \(\dfrac{1}{1-H(x)-mx}\)
计树
首先划分等价类,肯定划分一段连续的链是等价类
考虑如何计算,发现 \(k\) 段生成树的方案是 \(\prod\limits_i c_i n^{k-2}\)
显然合并是 \(G(x)=\dfrac{1}{1-x}-1\),\(F(x)=\dfrac{x^2}{1-x}\)
于是 \(H(x)\) 可以简单求出,答案的生成函数就是 \(\dfrac{1}{1-\sum\limits_i ni [x^i]H(x)}\)
这里加系数是没有问题的,因为合并的时候限制了连接方式,每个合并的依然只会被多算一次
Yet Another ABC String
这个题很经典了,考虑划分等价类是 \(\text{ABCAB}\) 这样的段,因为段长最大是 \(2\),因此生成函数是
\(F(x)=x+x^2,G(x)=\dfrac{1}{1-x}-1\) 容易知道容斥系数 \(H(x)=1-\dfrac{1}{1+x+x^2}\)
那么我们带上容斥系数连续段的生成函数是 \(\dfrac{x+y+z-3xyz}{1-xyz}\)
答案是 \([x^ay^bz^c]\dfrac{1-xyz}{1-x-y-z+2xyz}\),手动提取系数即可
集合幂级数上使用例
主旋律不写了
异或图
好了又来到我们集合幂级数阶段,让我们看看这个和主旋律及其相似的题是如何推导的,感受一下这个东西是如何在集合幂级数上工作的
首先得先会 \(m=0\),如果当前有一个数可以填任何值那么其他数都可以随便填了,方案数显然,所以可以类似数位 dp 的钦定第一个没顶到上界的位置,显然可以 \(O(n\log V)\) 直接做完
考虑容斥,我们钦定一个集合构成连通块,且它内部所有点的权值相等,这时容斥系数显然和图的形态有关,但是因为 \(n\) 很小,可以直接 \(3^n\) dp 出系数
这个容斥系数也可以通过我们的一般方法求出,事实上上面的过程就是我们构造了一个奇怪的合并函数,我们进行了 \(3^n\) 暴力求逆,这一步优化是显然的,修改等价类为所有 \(b_i\) 一样的点的集合,那么最后的 \(F\) 会变得奇怪,合并就变成普通的 exp 了,可以直接 \(O(n^2 2^n)\) Ln 求解系数
现在深刻的问题是,一个划分方案的答案不是每个方案答案的简单乘积,而是和集合的选择方式有关的,对于大小为偶数的连通块,它的贡献是 \(\min a_i+1\),最后的贡献需要乘上所有大小为奇数连通块内最小值的集合构成的上面那个子问题的答案
那么我们目前唯一的出路似乎就是计算出每种子问题的系数和,这可以通过一个 dp 实现,首先把所有点按照 \(a_i\) 从小到大排序,顺次考虑所有点,每次枚举一个集合加入,要求集合必须包含当前点,前提是当前点在之前没有加入过,如果加入的集合大小是偶数,这一位设成 \(1\),否则是 \(0\),复杂度 \(O(n3^n)\)
不过这个题目难点不在构造容斥系数罢了