P6295 有標號 DAG 計數

2022-05-30 17:36:07 字數 1178 閱讀 8030

求 \(n\) 個點有標號弱聯通 dag 數量。

設 \(f_i\) 表示 \(i\) 個點有標號 dag 數量(不保證弱聯通),有:

\[f(i)=\sum_^i\binom ij(-1)^f(i-j)2^

\]意義為選至少 \(j\) 個度數為零的點,向剩下的 \(i-j\) 個點隨便連有向邊,容斥一下就得到了上式。

下面進行推導。根據乙個 trick:

\[j(i-j)=\binom i2-\binom j2-\binom 2

\]所以有:

\[\begin

&f(i)=\sum_^i\frac (-1)^ f(i-j) \frac2}\\

\rightarrow&\frac=\sum_^i\frac} \frac2}

\end\]設

\[\begin

f(x)=\sum_^\infty\frac}\\

g(x)=\sum_^\infty\frac}

\end

\]則有

\[f(x)=f(x)g(x)+1

\]加 1 是因為常數項為 1.

解得\[f(x)=\frac1

\]根據 \(f\) 的定義,我們解出 \(f\) 後乘上 \(2^\binom i2\) 即為 \(f\) 的 egf。根據多項式 ln 和 exp 的組合意義,我們將得到的 egf ln 一下即可得到題目要求的弱聯通的 dag 數量的 egf。

#include#include#include#include#include#includeusing namespace std;

inline int read()

namespace star

struct ntt

void operator () (int *a,int type) const

inline void deri(const int *a,int *ans,int n)

inline void inte(const int *a,int *ans,int n)

inline void ln(const int *a,int *ans,int n)

int a[maxn],b[maxn],n,inv[maxn],mul[maxn];

inline void work()

}signed main()

有標號的DAG計數I IV

最近心血來潮來寫一寫這個玩意兒。請特別注意定義生成函式時下標的起始位置。求 n 點帶標號 dag 的數量模 10007 n le5000 資料範圍顯然 o n 2 設 f i 表示答案,列舉 dag 中入度為零的點的數量 j 方案數為 binom ij 將圖拆成兩個部分,前 j 個點向後 i j 個...

有標號DAG計數 生成函式

luogu 首先考慮暴力,很容易得出 f i sum limits 1 binom 2 f i j 相當於列舉度數為0的節點的個數,向不在這個集合裡的點任意連邊,之後需要容斥。考慮如何優化。j i j frac frac frac f i sum limits 1 frac frac sqrt f ...

有標號的DAG計數 II

給定一正整數n,對n個點有標號的有向無環圖 可以不連通 進行計數,輸出答案mod 998244353的結果 考慮 o n 2 dp 列舉出度為 0 的點,構成的新 dag 方案數為 f i f i 1 c 2 即從 n 個點中選出乙個點,作為出度為 0 的點,然後剩下 n 1 個點向這個點任意連邊 ...