題意:
求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 因為我們可以考慮欽定某一點...