ABC236Ex做题记录
*集合划分容斥的容斥系数
个人记录,写的像大便预警。主要是记录的对于题解的理解。
做了一个上午,何意味。
将相等关系转化为边。首先可以想到枚举边的情况进行暴力容斥,当这个图连边之后,会形成若干个连通块,我们不妨设这些连通块为 \(s_1,s2, \cdots ,s_k\) ,选出的边集为 \(S\),则答案为
时间复杂度至少是 \(2^{\frac{}{} n \times (n+1) / 2}\),显然超时了。
不过虽然边数很多,但是点只有 \(n\) 个,于是考虑能否通过点集进行容斥。令 \(f_i\) 为一张大小为 \(i\) 的连通图中,容斥系数之和。则可以得到一个式子:
为何不用通常的的容斥系数?因为这个问题的本质上是 枚举边集中不被满足的,而现在问题转化了就不能够随意使用了。
如何理解新的容斥系数?这里的新容斥系数本质是要求出 所有可以形成这个划分方法 的原容斥系数之和。现在把第一个式子中的 \(S\) 分解了。对于 \(s_i\) ,他的贡献就是他的所有连通子图贡献之和,因为块间相互独立,所以使用乘法原理。(真的感觉这里很感性!!!我智力怎么这么低)
考虑如何计算 \(f\),令 \(g_i\) 为大小为 \(i\) 的有向图的容斥系数之和。可知
上式第一步到第二步可由二项式定理得到。
钦定 \(1\) 所在的连通块大小,有
根据这个公式用 \(dp\) 求出答案。预处理 \(f\),令 \(dp_i\) 表示确定了 \(i\) 这一状态(状压后)内的所有点属于哪个连通块的答案,可以通过枚举接下来会确定哪个连通块进行转移,为避免算重只对于原点集第一个没考虑的点为新连通块中标号最小的点的情况转移,即
时间复杂度 \(O(2^n+3^n \log n^2)\)
总结:
小技巧:在进行连通图计数的时候,可以考虑枚举 \(1\) 节点所在的连通块。
对于这一题的容斥系数,主要是去想它转换后如何对应到原来的容斥方案中。还是很巧妙的。
这个题好像也有类似思想,可以感受一下,如果能苟到省选就补吧。
想了好久,这个题或成我有智力障碍的证明...
容斥,太困难!
c++14和20编译出来还不同,调了一亿年结果是这个东西,无语。

浙公网安备 33010602011771号