剛剛解決完電力網路的問題, 阿狸又被領導的任務給難住了.
剛才說過, 阿狸的國家有n個城市, 現在國家需要在某些城市對之間建立一些**路線, 使得整個國家的任意兩個城市都直接或間接的連通. 為了省錢, 每兩個城市之間最多只能有一條直接的**路徑. 對於兩個建立路線的方案, 如果存在乙個城市對, 在兩個方案中是否建立路線不一樣, 那麼這兩個方案就是不同的, 否則就是相同的. 現在你需要求出一共有多少不同的方案.
好了, 這就是困擾阿狸的問題. 換句話說, 你需要求出n個點的簡單(無重邊無自環)無向連通圖數目.
由於這個數字可能非常大, 你只需要輸出方案數mod 1004535809(479 * 2 ^ 21 + 1)即可.
僅一行乙個整數n(<=130000)
僅一行乙個整數, 為方案數 mod 1004535809.
3
4
對於 100%的資料, n <= 130000
設\(f(i)\)為\(i\)個點的題目所求的答案,\(g(i)\)為\(i\)個點隨便連的方案數,那麼我們列舉\(1\)號點所在聯通塊的大小,可得:
\[g(n)=\sum_^nf(i)\binomg(n-i)=2^}=2^
\]容易知道這樣可以不重不漏的算到所有狀態。
我們把\(g\)帶進去:
\[2^=\sum_^nf(i)\binom2^}
\]兩邊除以\((n-1)!\):
\[\frac}=\sum_^n\frac\times \frac}}
\]注意到這是個卷積的形式,用生成函式表示一下:
\[a(x)=\sum_^\infty\frac}x^n\\
b(x)=\sum_^\infty\frac}x^n\\
f(x)=\sum_^\infty\fracx^n
\]那麼:
\[a(x)=f(x)b(x),f(x)=a(x)b^(x)
\]那麼直接套多項式求逆的板子就好了。
#includeusing namespace std;
void read(int &x)
void print(int x)
void write(int x)
#define lf double
#define ll long long
const int maxn = 6e5+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 1004535809;
int n,w[maxn],rw[maxn],pos[maxn],f[maxn],a[maxn],b[maxn],c[maxn],mxn,n,bit,fac[maxn],ifac[maxn],g[maxn];
int qpow(int aa,int x)
void prepare()
void ntt(int *r,int op)
bzoj 3456 城市規劃
題意 求n個點的無向連通圖個數 n個點不同,答案對1004535809取模 n 130000 題解 生成函式的種種神奇應用 不過這玩意真是越來越不oi了 笑 這道題首先考慮遞推公式 設f x 為結點數為x的答案 那麼用總的無向圖數減去不連通的無向圖數目就是答案 f i 2 i i 1 2 f j 2...
bzoj3456 城市規劃
time limit 40 sec memory limit 256 mb submit 342 solved 204 submit status discuss 剛剛解決完電力網路的問題,阿狸又被領導的任務給難住了.剛才說過,阿狸的國家有n個城市,現在國家需要在某些城市對之間建立一些 路線,使得整...
bzoj 3456 城市規劃
好像歐爺很久以前就考過這道題了,然而我這個幼兒園小同學到現在才寫 懶得寫題解了,寫完後找幾份好點的題解搬了 求 n 個點無標號簡單無向連通圖個數。方法1那個所謂的 麥克勞林級數 說得有點高階。其實那個式子就是指數生成函式,然後根據某些特性 當然我不會證 指數生成函式可以表示成 e 的冪。方法2 最後...