EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

P6295 有标号 DAG 计数

题目描述

n 个点有标号的有向无环图进行计数,要求:弱连通图(所有的有向边替换为无向边后的图为连通图)。输出答案对 998244353 取模的结果。

输入格式

一个整数 T

输出格式

T 行,第 i(1iT) 行输出 n=i 时的答案。

输入输出样例 #1

输入 #1

1
5

输出 #1

1
2
3
4
5
1
2
18
446
26430

说明/提示

第一个点 T=2000

第二个点 T=100000

题解

考虑先求出任意有标号 DAG,然后对 EGF 求一下 ln 即可得到弱连通的 DAG 数量。

f(i) 表示 i 个点的有标号 DAG 数量,则:

f(i)=j=1iCij×f(ij)×2j(ij)×(1)j+1

枚举至少有 j 个入度为 0 的点的个数(因为 DAG,所以一定存在至少一个入度为 0 的点),剩余的 ij 个点构成 DAG,这 j 个点到另外 ij 个点任意选择连不连边。但是注意到这个 j 没有保证恰好,只是保证最少有 j 个入度为 0 的点,所以还需要容斥一下。

然后把 Cij2j(ij) 分别解决掉就可以了。

Cij 我们再熟悉不过,求两边的 EGF 即可消去。

另一个 trick 也是常用的:

j×(ij)=Ci2Cj2Cij2

所以:

2j(ij)=2Ci22Cj2×2Cij2

按照和 EGF 相同的策略,我们设两个生成函数:

A(x)=i=0+f(i)i!×2Ci2xiB(x)=i=0+(1)i+1i!×2Ci2xi

那么改写最上面的式子,就有:

A(x)=A(x)B(x)+1

最后的 +1 是因为 f0=1

解得:

A(x)=11B(x)

计算可得 A(x) 的值。

最后考虑弱连通的条件,不弱连通的 DAG 肯定由若干个连通分量组合。设 f(i) 的 EGF 为 F(x),弱连通 DAG 的 EGF 为 H(x),那么按照 EGF 的组合意义:

F(x)=exp(H(x))

所以:

H(x)=ln(F(x))

总的过程是一次求逆和一次 ln,时间复杂度 O(nlogn)