像潮落潮涌,送我奔向自由。|

寂静的海底

园龄:3年2个月粉丝:59关注:15

2023-02-23 14:51阅读: 99评论: 0推荐: 1

带标号弱连通DAG计数

带标号弱连通DAG计数

前言:

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


题意:对弱连通带标号的简单 DAG 计数,n105

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

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

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

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

令钦定 i 个点这层的点的方案数为 si,恰好 i 个点的方案数为 ti,则有 si=ji(ji)tj

有二项式反演

ti=ji(ji)(1)jisj

其中

si=(ni)×2i(ni)×fni

我们写出原本的式子:

fi=j=1itj=j=1ikj(kj)(1)kj(ik)2i(ik)fik

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

fi=k=1i(ik)2i(ik)fikj=1k(kj)(1)kj

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

fi=k=1i(ik)2i(ik)fik×(1)k+1

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

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

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

fii!2(i2)=k=1ifik(ik)!2(ik2)×(1)k+12(k2)k!

所以将 fii!2(i2) 看作有序集族数,(1)k+12(k2)k! 看作集合数,多项式求逆即可做到 O(nlogn)

posted @   寂静的海底  阅读(99)  评论(0编辑  收藏  举报
历史上的今天:
2022-02-23 珂朵莉树学习笔记
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起