bzoj 3456 城市規劃

2021-07-05 06:23:37 字數 1525 閱讀 2983

題意:

求n個點的無向連通圖個數;

n個點不同,答案對1004535809取模;

n<=130000;

題解:

生成函式的種種神奇應用;

不過這玩意真是越來越不oi了(笑);

這道題首先考慮遞推公式;

設f[x]為結點數為x的答案;

那麼用總的無向圖數減去不連通的無向圖數目就是答案;

f[i]=2^(i*(i-1)/2)-∑f[j]*2^(j*(j-1)/2)*c[i-1][j-1];(1<=i<=n,1<=j這個遞推式是o(n^2)的,也沒什麼優化的地方;

所以從生成函式的方向來考慮;

不考慮n個點的不同問題,列出n個點無向連通圖的指數級生成函式;

f(x)=∑f[i]*x^i/i!;

而對於無向圖的生成函式我們也可以列出來;

g(x)=∑2^(i*(i-1)/2)*x^2/i!;

這兩個函式從意義上來說是乙個集合的劃分的關係;

所以有結論,g(x)=e^f(x);

也就是f(x)=ln(g(x));

在模意義下,除了1以外的數都沒有ln,而g(x)的常數項恰好為1;

所以存在唯一的解,對多項式求ln就好了;

然後由f(x)倒推回f[x],時間複雜度o(nlogn);

ln這東西不用倍增真是太好了= =;

upd 2016-1-5:

現在看看我真是*****哦。。那個方程不是不可優化的;

f[i]=2^(i*(i-1)/2)-∑f[j]*2^(j*(j-1)/2)*c[i-1][j-1]

考慮提出c[i-1][j-1]中的(i-1)!之後,求和式裡就只有與j相關的和與i-j+1相關的了;

這樣顯然是乙個卷積的形式,考慮計算貢獻的話就可以用cdq+fft的演算法來解決,時間複雜度o(nlog^2n);

恩。。。總之都是好辦法呢,無論是求ln的優雅還是這個優化的直接明了;

**:

#include#include#include#define n 262144

using namespace std;

typedef long long ll;

const int mod=1004535809;

int a[n],b[n],fact[n];

int pow(int x,int y)

return ret;

}void ntt(int *a,int len,int type)

for(h=2;h<=len;h<<=1)

}} if(type==-1)

int main()

a[0]=1,fact[0]=1;

for(i=1;i<=n;i++)

ln(a,b,m);

printf("%d\n",(ll)b[n]*fact[n]%mod);

return 0;

}

bzoj3456 城市規劃

time limit 40 sec memory limit 256 mb submit 342 solved 204 submit status discuss 剛剛解決完電力網路的問題,阿狸又被領導的任務給難住了.剛才說過,阿狸的國家有n個城市,現在國家需要在某些城市對之間建立一些 路線,使得整...

bzoj 3456 城市規劃

好像歐爺很久以前就考過這道題了,然而我這個幼兒園小同學到現在才寫 懶得寫題解了,寫完後找幾份好點的題解搬了 求 n 個點無標號簡單無向連通圖個數。方法1那個所謂的 麥克勞林級數 說得有點高階。其實那個式子就是指數生成函式,然後根據某些特性 當然我不會證 指數生成函式可以表示成 e 的冪。方法2 最後...

BZOJ3456 城市規劃

轉送門 我們設點數為 n 的簡單圖的數量為 f n 點數為 n 的簡單連通圖有 g i 個 於是我們知道,從 n 個點中選 2 個點有 n choose 2 種選法,而對於兩個點可以連邊或不連,於是 f n 2 同時,f n 還滿足 f n sum limits g if 因為我們可以考慮欽定某一點...