带标号弱连通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!} \]

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

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