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 #include2view code#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()
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 為上式,即不保證連通時的方案數 於...