【题解】P6295 带标号 DAG 计数 | 容斥 多项式

我的博客查看。

带标号弱连通 DAG 计数

前言:

前段时间做到了一个无向图边定向的题,就一直没搞懂其中的容斥,今天终于弄懂了。


题意:对弱连通带标号的简单 DAG 计数,$n\leq10^5$。

“弱连通”这个限制可以表示为“集和”,任意 DAG 可以视作“集族”,所以二者的 EGF 满足关系 $\operatorname{Exp}(g(x))=f(x)$,求出任意 DAG 计数再做 $\operatorname{ln}$ 即可,现在考虑如何求出任意 DAG 计数。

考虑 dp,令 $f_x$ 表示 $x$ 个点的 DAG 的数量。

考虑将 DAG 分层,然后按照拓扑序加点,新加入的一些点没有后继,并且让原本的点向这些点连边。

但是考虑到原本的某些点也没有后继,即分层后相邻的若干层其实可以合并成一层,所以考虑容斥。

令钦定 $i$ 个点这层的点的方案数为 $s_i$,恰好 $i$ 个点的方案数为 $t_i$,则有 $s_i=\sum _{j\geq i} \binom{j}{i}t_j$。

有二项式反演

$$ t_i=\sum _{j\geq i} \binom{j}{i}(-1)^{j-i}s_j $$

其中

$$ s_i=\binom{n}{i}\times2^{i(n-i)}\times f_{n-i} $$

我们写出原本的式子:

$$ \begin{aligned} f_i &=\sum_{j=1}^i t_j\\ &=\sum _{j=1}^i \sum_{k\geq j} \binom{k}{j}(-1)^{k-j}\binom{i}{k}2^{i(i-k)} f_{i-k} \end{aligned} $$

因为转移来的项和 $k$ 相关所以把求和换位,和 $k$ 相关的放到前面:

$$ \begin{aligned} f_i &=\sum_{k=1} ^i \binom{i}{k}2^{i(i-k)} f_{i-k} \sum _{j=1}^k \binom{k}{j}(-1)^{k-j} \end{aligned} $$

把后面那坨补上一个 $(-1)^k$ 即可使用二项式定理得到 $0$,所以

$$ f_i=\sum_{k=1}^i\binom{i}{k} 2^{i(i-k)} f_{i-k} \times(-1)^{k+1} $$

感性地理解可以将含 $i$ 个点层看作拥有 $i$ 个属性的容斥。

这个东西显然可以分治 NTT ,把 $2$ 的指数拆成二次剩余或者组合数作差就可以做到。

考虑优化,将这个式子变形一下,可以得到:

$$ \frac {f_i}{i!2^{\binom{i}{2}}}=\sum_{k=1}^i \frac { f_{i-k} }{(i-k)!2^\binom{i-k} {2}} \times \frac {(-1)^{k+1}}{2^{\binom k 2}k!} $$

所以将 $\dfrac {f_i}{i!2^{\binom{i}{2}}}$ 看作有序集族数,$\dfrac {(-1)^{k+1}}{2^{\binom k 2}k!}$ 看作集合数,多项式求逆即可做到 $O(n\log n)$。

posted @ 2023-02-23 14:55  寂静的海底  阅读(2)  评论(0编辑  收藏  举报  来源