最近心血來潮來寫一寫這個玩意兒。
請特別注意定義生成函式時下標的起始位置。
求\(n\)點帶標號\(dag\)的數量模\(10007\)。\(n\le5000\)。
資料範圍顯然\(o(n^2)\)。設\(f_i\)表示答案,列舉\(dag\)中入度為零的點的數量\(j\),方案數為\(\binom ij\),將圖拆成兩個部分,前\(j\)個點向後\(i-j\)個點的連邊任意,方案數為\(2^\),後\(j\)個點構成一張\(dag\),方案數為\(f_\)。
但是這樣並不保證入度為零的點只有\(j\)個,所以需要容斥。
\[f_i=\sum_^i(-1)^\binom ij2^f_
\]求\(n\)點帶標號\(dag\)的數量模\(998244353\)。\(n\le100000\)。
首先\(2^\)需要處理一下。需要想辦法把\(ij\)項去掉。
\(j(i-j)=\frac-\frac-\frac\)。
好在模\(998244353\)意義下存在\(2\)的二次剩餘。所以可以把原遞推式劃一劃。
\[f_i=\sum_^i(-1)^\frac\frac}\sqrt2^}f_
\]令\(f(x)=\sum_^n\frac}x^i,g(x)=\sum_^n\frac}}x^i\),
則有\(f(x)=g(x)f(x)+1\),故\(f(x)=\frac\)。
多項式求逆即可。
求\(n\)點帶標號\(dag\)的數量模\(10007\),要求圖弱連通。\(n\le5000\)。
首先還是把前面的\(f_i\)求出來,然後列舉某乙個點所在的弱連通\(dag\)大小,有遞推式:
\[g_i=f_i-\sum_^\binomf_jg_
\]求\(n\)點帶標號\(dag\)的數量模\(998244353\),要求圖弱連通。\(n\le100000\)。
劃一下式子:
\[\frac=\frac-\sum_^\frac\frac}
\]設\(f(x)=\sum_^n\fracx^i,g(x)=\sum_^n\fracx^i,h(x)=\sum_^n\fracx^i\),
則有\(g(x)=h(x)-f(x)g(x)\),故\(g(x)=\frac\)。
以上是方法一。
方法二非常地有趣。我們發現乙個帶標號的\(dag\)不要求弱連通實質上是由若干個弱連通\(dag\)構成的,我們設第二題答案的指數生成函式為\(f(x)\),第四題答案的指數生成函式為\(g(x)\),於是就有$$f(x)=e^$$
也就是$$g(x)=\ln f(x)$$
多項式求\(\ln\)即可。
#include#includeusing namespace std;
const int n = 5005;
const int mod = 10007;
int n,c[n][n],bin[n*n],f[n];
int main()
#include#includeusing namespace std;
const int n = 3e5+5;
const int mod = 998244353;
const int rem = 882049182;
int n,jc[n],jcn[n],g[n],f[n],rev[n],og[n];
int fastpow(int a,int b)
return res;
}void init(int len)
return res;
}void init(int len)
return res;
}void init(int len)
void get_der(int *a,int *b,int len)
void get_int(int *a,int *b,int len)
int s2[n],s3[n];
void get_ln(int *a,int *b,int len)
int main()
int len=1;while (len<=n) len<<=1;
get_inv(g,f,len);
for (int i=0;i<=n;++i) f[i]=1ll*f[i]*fastpow(rem,1ll*i*i%(mod-1))%mod;
for (int i=n+1;imemset(g,0,sizeof(g));get_ln(f,g,len);
printf("%lld\n",1ll*g[n]*jc[n]%mod);
return 0;
}
帶標號的DAG計數I IV
帶標號的dag計數,陳指導最近出了一道最基礎的,發現好久沒用過生成函式那一類的了就來看看 dag的定義相信都不同多說了,以下預設對 998244353 取模 pro 求 n 點帶標號的dag的數目,不強制聯通,n le 5000 sol 顯然考慮 o n 2 設 f i 表示答案,我們每次列舉dag...
有標號的DAG計數 II
給定一正整數n,對n個點有標號的有向無環圖 可以不連通 進行計數,輸出答案mod 998244353的結果 考慮 o n 2 dp 列舉出度為 0 的點,構成的新 dag 方案數為 f i f i 1 c 2 即從 n 個點中選出乙個點,作為出度為 0 的點,然後剩下 n 1 個點向這個點任意連邊 ...
有標號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 ...