bzoj3456 城市規劃 多項式,分治

2022-02-18 14:53:12 字數 1725 閱讀 2391

description

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

物理學考是想fft的好時間。

首先,按照習慣fft的題先當成dp做。

設$f_i$表示有i個點的聯通圖有幾個。

然後我們發現它不能轉移。

於是我們設$g_i$表示有i個點的不聯通圖有幾個。

$f_i+g_i=2^}$

就是聯不聯通的情況都加起來就是所有的圖,總數量就是討論每一條邊建不建。

然後我們要考慮怎麼轉移不會重複。乙個比較簡單的想法是去掉不聯通圖中的聯通塊,但是這樣會重複。

多yy幾分鐘。於是就想到之前的常用技巧:欽定。

我們欽定編號最大的點所在的聯通塊。每次只去除這個聯通塊。這樣就不重複了。

$g_i=\sum\limits_^ f_j \times (f_ + g_) \times c_^$

含義就是:列舉i號點所在的聯通塊大小為j,這個聯通塊的總方案數是$f_j$,剩餘部分隨意反正它已經不聯通了,是$f_+g_$

然後再在除了i號點以外的$i-1$個點中選定具體是哪$j-1$個點和點i在同乙個聯通塊裡,是$c_^$

然後發現轉移是帶有依賴的,於是用分治fft解決。

1 #include2

#define int long long

3#define mod 1004535809

4#define s 131073

5int

a[s],b[s],h[s],fac[s],inv[s],g[s],len,n,rev[s];

6int pow(int b,int t,int a=1)

7int c(int b,int t)

8void ntt(int *a,int

opt)

17void solve(int l,int

r)19

int mid=l+r>>1

;solve(l,mid);

20 len=1;while(len<=r-l+1)len<<=1;21

for(int i=0;i0;22

for(int i=0;i<=r-l+1;++i)a[i]=h[i]*inv[i]%mod;

23for(int i=l;i<=mid;++i)b[i-l]=(h[i]-g[i]+mod)*inv[i-1]%mod;

24 ntt(a,1);ntt(b,1

);25

for(int i=0;imod;

26 ntt(a,-1

);27

for(int i=mid+1;i<=r;++i)g[i]=(g[i]+a[i-l])%mod;

28 solve(mid+1

,r);29}

30signed main()

view code

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個城市,現在國家需要在某些城市對之間建立一些 路線,使得整個國家的任意兩個城市都直接或間接的連通.為了省錢,每兩個城市之間最多只能有一條直接的 路徑.對於兩個建立路線的方案,如果存在乙個城市對,在兩個方案中是否建立路線不一...

bzoj3456城市規劃 多項式取模

求出有n個點的有標號簡單連通無向圖的數目。什麼破玩意,直接輸出 2 走人 我們發現這張圖要求連通,而上式肯定不能保證連通。其實上式表示的是不保證連通的有標號簡單無向圖。就差在乙個連通上啊。所以我們設 f x 表示有x個點的有標號簡單連通無向圖的數目。然後設 g x 為上式,即不保證連通時的方案數 於...