1. 程式人生 > >[JZOJ3303][BZOJ3456] 城市規劃【多項式】【生成函式】【未完成】

[JZOJ3303][BZOJ3456] 城市規劃【多項式】【生成函式】【未完成】

Description

剛剛解決完電力網路的問題, 阿狸又被領導的任務給難住了.
剛才說過, 阿狸的國家有n 個城市, 現在國家需要在某些城市對之間建立一些貿易路線, 使得整個國家的任意兩個城市都直接或間接的連通.
為了省錢, 每兩個城市之間最多隻能有一條直接的貿易路徑. 對於兩個建立路線的方案, 如果存在一個城市對, 在兩個方案中是否建立路線不一樣, 那麼這兩個方案就是不同的, 否則就是相同的. 現在你需要求出一共有多少不同的方案.
好了, 這就是困擾阿狸的問題. 換句話說, 你需要求出n 個點的簡單(無重邊無自環)無向連通圖數目.
由於這個數字可能非常大, 你只需要輸出方案數mod 1004535809(479 * 2 ^21 + 1)即可.
n<=130000

Solution

我們有兩種思路
一是考慮DP
f [ i ] f[i] 為i個點的無向連通圖個數, g [

i ] g[i] 為i個點的無向圖個數
顯然 g [ i ] = 2
n ( n 1 ) 2 g[i]=2^{n(n-1)\over 2}
(每條邊有或沒有)

正難則反,我們可以考慮用總的減去不連通的
不妨列舉某一個點所在的聯通塊的大小(為了避免重複,我們當做列舉的點是標號最小的那個)
那麼 f [ i ] = g [ i ] j = 1 i 1 f [ j ] ( i 1 j 1 ) g [ i j ] f[i]=g[i]-\sum\limits_{j=1}^{i-1}f[j]*{i-1\choose j-1}*g[i-j]
列舉1號點所在連通塊大小,組合數計算其中點的情況,剩下i-j個點隨便組成一個無向圖
這一定唯一對應了一種不合法情況

直接轉移複雜度是不能接受的,考慮優化
看到 f [ j ] g [ i j ] f[j]*g[i-j] 我們容易想到卷積
組合數拆開
f [ i ] = g [ i ] j = 1 i 1 f [ j ] ( i 1 ) ! ( j 1 ) ! ( i j ) ! g [ i j ] f[i]=g[i]-\sum\limits_{j=1}^{i-1}f[j]*{(i-1)!\over (j-1)!(i-j)!}*g[i-j]
分配一下,(i-1)除過來
f [ i ] ( i 1 ) ! = g [ i ] ( i 1 ) ! j = 1 i 1 f [ j ] ( j 1 ) ! g [ i j ] ( i j ) ! {f[i]\over (i-1)!}={g[i]\over (i-1)!}-\sum\limits_{j=1}^{i-1}{f[j]\over (j-1)!}*{g[i-j]\over (i-j)!}

此時可以考慮用CDQ分治
對於分治區間 [ l , r ] [l,r] ,遞迴計算 [ l , m i d ] [l,mid] ,然後用NTT快速計算出 [ l , m i d ] [l,mid] [ m i d + 1 , r ] [mid+1,r] 的貢獻,然後遞迴右邊即可

複雜度 O ( n log 2 n ) O(n\log^2 n)

然而這不是重點

如果我們移項,將左邊的併入右邊卷積式子,就有
g [ i ] ( i 1 ) ! = j = 1 i f [ j ] ( j 1 ) ! g [ i j ] ( i j ) ! {g[i]\over (i-1)!}=\sum\limits_{j=1}^{i}{f[j]\over (j-1)!}*{g[i-j]\over (i-j)!}

如果我們將上面三部分分別看成三個多項式 A ( x ) , F ( x ) , B ( x ) A(x),F(x),B(x)
A ( x ) = i &gt; 0 g [ i ] x i ( i 1 ) ! A(x)=\sum\limits_{i&gt;0}{g[i]*x^i\over (i-1)!}
B ( x ) = i 0 g [ i ] x i i ! B(x)=\sum\limits_{i\geq0}{g[i]*x^i\over i!}
F ( x ) = i &gt; 0 f [ i ] x i ( i 1 ) ! F(x)=\sum\limits_{i&gt;0}{f[i]*x^i\over (i-1)!}

容易看出 A ( x ) = B ( x ) F ( x ) A(x)=B(x)F(x)