剛剛解決完電力網路的問題, 阿狸又被領導的任務給難住了.
剛才說過, 阿狸的國家有n個城市, 現在國家需要在某些城市對之間建立一些**路線, 使得整個國家的任意兩個城市都直接或間接的連通. 為了省錢, 每兩個城市之間最多只能有一條直接的**路徑. 對於兩個建立路線的方案, 如果存在乙個城市對, 在兩個方案中是否建立路線不一樣, 那麼這兩個方案就是不同的, 否則就是相同的. 現在你需要求出一共有多少不同的方案.
好了, 這就是困擾阿狸的問題. 換句話說, 你需要求出n個點的簡單(無重邊無自環)無向連通圖數目.
由於這個數字可能非常大, 你只需要輸出方案數mod 1004535809(479 * 2 ^ 21 + 1)即可.
僅一行乙個整數n(<=130000)
僅一行乙個整數, 為方案數 mod 1004535809.34
對於 100%的資料, n <= 130000
題解:一直打算做來著,前幾天終於抽空把這題過了~
設f[n]表示n個點的簡單無向連通圖數目,先列出大家都會的dp方程:
$f[n]=2^-\sum\limits_^f[i]c_^2^$
哎呀好多n-1太煩了,還是令f[n]表示n+1個點的簡單無向連通圖數目吧:
$f[n]=2^-\sum\limits_^f[i]c_n^i2^$
組合數很不優美是不是?那就拆了好啦。
$f[n]=2^-n!\sum\limits_^\over i!(n-i)!}$
下面我們想把只含有含有n的放到一起,i放到一起,n-i放到一起,於是瘋狂移項得到:
$=\over n!}-\sum\limits_^\cdot\over (n-i)!}$
明朗很多了是不是?令$f(x)=,g(x)=\over x!},h(x)=\over x!}$,特別地,h(0)=0。
所以$f(x)=g(x)-f(x)*h(x)$,$f(x)=$,多項式求個逆就好了。
#include #include #include #include using namespace std;typedef long long ll;
const ll p=1004535809;
const int maxn=(1<<19)+4;
int n;
ll a[maxn],b[maxn],c[maxn],d[maxn],ine[maxn],jc[maxn],jcc[maxn];
inline ll pm(ll x,ll y)
return z;
}inline void ntt(ll *a,int len,int f)
ll wn,w,t;
for(h=2;h<=len;h<<=1)
int main()
bzoj3456 城市規劃 多項式,分治
description 剛剛解決完電力網路的問題,阿狸又被領導的任務給難住了.剛才說過,阿狸的國家有n個城市,現在國家需要在某些城市對之間建立一些 路線,使得整個國家的任意兩個城市都直接或間接的連通.為了省錢,每兩個城市之間最多只能有一條直接的 路徑.對於兩個建立路線的方案,如果存在乙個城市對,在兩...
bzoj3456 城市規劃 多項式求In
n 個點的無向聯通圖的個數 打著好累啊 一定要封裝乙個板子 記 c x 為無向圖個數的指數型生成函式,c 0 1 記 g x 為無向聯通圖個數的指數型生成函式,g 0 0 那麼 g x e 從而,c x in g x 複雜度 o n log n include include include inc...
多項式求逆 BZOJ3456 城市規劃
剛剛解決完電力網路的問題,阿狸又被領導的任務給難住了.剛才說過,阿狸的國家有n個城市,現在國家需要在某些城市對之間建立一些 路線,使得整個國家的任意兩個城市都直接或間接的連通.為了省錢,每兩個城市之間最多只能有一條直接的 路徑.對於兩個建立路線的方案,如果存在乙個城市對,在兩個方案中是否建立路線不一...