求 \(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 個點向這個點任意連邊 ...