AIGC标识 容斥系数的一些思考

首先容斥系数的目的是,因为我们不管限制算了答案,但这里面那些非法的部分,要用容斥系数把它删去,且不能删去本来合法的部分。不过多数时候合法的不会计算,麻烦的是减多了。最经典的例子,想找到语文好的或者数学好的(其实是找补集),你把语文不好的扔了,把数学不好的扔了,那两个都不好的就一起扔了。而 OI 中就没这么简单了,如果是状压类似的容斥的容斥系数还要抵消掉状压顺序带来的影响,要精妙构造。一半下手的地方就是边界,推出 \(w_1,w_2,w_3\),后面的也就出来了。

接下来是 deepseek 大哥对这道题的具体推导,值得阅读。


容斥系数本质上是一个连通块内部所有连通图按边数容斥后的权和

设一个连通块大小为 \(s\),定义

$ w_s=\sum_{\substack{G\text{ 是 }s\text{ 个标记点上的连通图}}}(-1)^{|E(G)|} $

在容斥枚举边集时,每个连通块都会贡献一个这样的 \(w_s\)


计算 \(w_s\)

先考虑所有图(不一定连通)的权和:

$ A_s=\sum_{\text{所有 }s\text{ 个点上的图}}(-1)^{|E(G)|}
=(1-1)^{\binom{s}{2}} $

所以当 \(s\ge 2\) 时,\(A_s=0\);而 \(A_0=1,\ A_1=1\)

\(1\) 号点所在连通块大小 \(k\) 分类,有

$ A_s=\sum_{k=1}^{s}\binom{s-1}{k-1}w_kA_{s-k} $

\(s\ge 2\) 时,左边为 \(0\)。而 \(A_{s-k}=0\) 除非 \(s-k=0\)\(s-k=1\),所以只剩下两项:

$ 0=w_s+\binom{s-1}{s-2}w_{s-1}A_1
=w_s+(s-1)w_{s-1} $

因此

$ w_s=-(s-1)w_{s-1} $

\(w_1=1\),递推得

$ w_s=(-1)^{s-1}(s-1)! $


对应到代码中的系数

DP 枚举划分时,会固定当前集合中的最小点 \(p\)。假设 \(p\) 所在块中\(p\)还有 \(r\) 个点,那么这个块的大小为

$ s=r+1 $

所以该块的容斥贡献为

$ w_s=w_{r+1}=(-1)^r r! $

代码中

xi[i] = xi[i-1] * (mod - i) % mod;

因为 \(mod-i\equiv -i\pmod{mod}\),所以

$ xi[i]\equiv (-1)^i i! $

在转移时用到的就是 \(xi[pop[j]]\),其中 \(j\) 正是当前块中除固定点外的点集,因此系数就是

$ (-1)^{|T|}|T|! $

所以这个容斥系数并不是凭空而来,而是所有连通图边数容斥和的结果。

posted @ 2026-08-24 22:16  今天你学废了么  阅读(9)  评论(0)    收藏  举报