有標號DAG計數 生成函式

2022-05-09 19:42:49 字數 1128 閱讀 4786

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[ i-j ] $ 。

構造 $ f(x) = \sum\limits_^ \frac }^ } } x^ , g(x) = \sum\limits_^ \frac }^ } } x^ $ ,

有 $ f( x ) = f( x )g( x ) + 1 $ ,直接求逆。

如果要求圖必須是弱連通呢?

直接對egf取ln就好。

#includeusing namespace std;

typedef long long lint;

namespace rkk

lint doadd(lint &a,lint b)

lint fpow(lint a,lint p)return ret;}

lint wg[n],iwg[n];int rev[n],lastlen;

inline void init()

inline void ntt(lint *a,int len,int tp)

void work(lint *f,lint *g,int n) }

}int n;

lint inv[n],fac[n],ifac[n];

void sieve(int n)

lint f[n],g[n],h[n];

int main()

poly::inv::work(g,f,len);//求出不保證聯通的

for(int i=0;ipoly::ln::work(f,h,len);

for(int i=1;i<=n;i++) printf("%lld\n",h[i]*fac[i]%mo);

return 0;}}

int main()

有標號的DAG計數I IV

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

有標號的DAG計數 II

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

題解 有標號的DAG計數3

我們已經知道了 f i 表示不一定需要聯通的 i 節點的dag方案,考慮合併 參考 題解 p4841 城市規劃 指數型母函式 多項式ln 然後答案 h i 母函式 h x 就這樣解 由於 h x sum dfrac 則 h x e 球 ln 就是iv,不求的話可以直接手動模擬 f x i i win...