題解 有標號的DAG計數1

2022-02-23 19:51:54 字數 1118 閱讀 6153

設\(f_i\)為\(i\)個點時的dag圖,(不必聯通)

考慮如何轉移,由於乙個dag必然有至少乙個出度為\(0\)的點,所以我們欽定多少個出度為\(0\)的點轉移。

考慮如何保證沒有環,欽定完出度為\(0\)的點後,這些點就等著被連線了。還剩下一些點,這些點只要不構成環就好了,就是個子結構,訪問以前的dp陣列就好了。

\[ 2^dp_

\]這樣轉移顯然有方案重複的情況,因為如此計數就破壞了欽定,出度為\(0\)點可能更多!(我們不加限制的列舉\(j(i-j)\)條邊是否存在)。

考慮一種方案出現了多少次,很顯然出現的分布是這樣的:

\[++\dots

\]借鑑一下[【題解】haoi2018]染色(ntt+容斥/二項式反演)(怎麼又是你),直接乘上乙個\((-1)^?\)就就容斥掉了,試一試就發現是\((-1)^\)

轉移是:

\[dp_i=\sum_^i 2^dp_(-1)^

\]或者學習神itst的神仙待定係數法

設列舉的出度為\(0\)的點的個數為i時的容斥係數為\(f_i\),那麼乙個實際上存在\(x\)個出度為0的點的dag的貢獻就是\(\sum\limits_^x \binom f_i = 1\),不難由二項式定理知道\(fi=(−1)^\)

orz orz

//@winlere

#include#include#include#includeusing namespace std; typedef long long ll;

inline int qr()

const int maxn=5e3+5;

const int mod=10007;

int c[maxn][maxn];

int dp[maxn];

int bin[maxn*maxn];

int main()

}for(register int t=1;t<=n*n;++t) bin[t]=(bin[t-1]<<1)%mod;

for(register int t=1;t<=n;++t)

}printf("%d\n",dp[n]);

return 0;

}

題解 有標號的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...

有標號的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 個點向這個點任意連邊 ...