洛谷 P4841 城市規劃 解題報告

2022-04-29 23:45:07 字數 1169 閱讀 2415

n個有標號點的簡單(無重邊無自環)無向連通圖數目.

僅一行乙個整數\(n(\le 130000)\)

僅一行乙個整數, 為方案數 \(\bmod 1004535809\).

設\(g_i\)表示\(i\)個點的圖的數目,\(f_i\)表示\(i\)個點聯通圖的個數

\[g_n=f_n+\sum_^f_i\binomg^

\]意義是聯通圖+非聯通圖,關於非聯通圖的方案,列舉1號點所在聯通塊然後剩下的隨意構圖,不連通。

顯然有\(g_n=2^}\),化簡一波式子

\[\begin

2^}&=\sum_^nf_i\binom2^}\\

\frac}}&=\sum_^n\frac\frac}}

\end

\]然後令

\[f(i)=\frac,g(i)=\frac}},h(i)=\frac}}

\]顯然有

\[g=f*h

\]對\(h\)求個逆就可以了。

一些關於意義的邊界問題可以試試,反正不是0就是1..

調這個題的時候因為把指數給膜了,掛了20年...

code:

#include #include const int mod=1004535809,gi=334845270;

const int n=(1<<20)+10;

#define mul(a,b) (1ll*(a)*(b)%mod)

#define add(a,b) ((a+b)%mod)

int fac[n],inv[n],a[n],b[n],t[2][n],g[n],h[n],turn[n],n,len,l;

int qp(int d,int k)return f;}

void ntt(int *a,int typ)

{ for(int i=1;i>1;i++) a[i]=a[i],b[i]=b[i];

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

for(int i=0;i>1]>>1|(i&1)<>1;i++) t[cur][i]=add(t[cur^1][i],t[cur^1][i]);

polymul(t[cur^1],t[cur^1]);

polymul(t[cur^1],a);

for(int i=0;i2018.12.26

洛谷P4841 城市規劃

題目大意 求 n 個點的帶標號的無向連通圖的個數 題解 令 f x 為帶標號無向連通圖個數生成函式,g x 為帶標號無向圖個數生成函式 那麼 g x sum dfrac x i 列舉連通塊個數可得 g x sum dfrac f x f x 0 dfrac dfrac cdots dfrac x 0...

洛谷4841 城市規劃

題意 求 n 個點的簡單 無重邊無自環 有標號無向連通圖數目。思路 設 f n 為點數為 n 的無向連通圖的數量,g n 為點數為 n 的無向圖的數量,可以知道 g n 2 可以這麼理解,n 個點中取兩個點連邊,一共有 c n 2 種,每個邊存在連或不連兩種可能。同時有 g n sum nc f i...

P4841 集訓隊作業2013 城市規劃

設 f i 表示 i 個點的無向連通圖個數,g i 表示 i 個點的無向圖個數。列舉 1 所在連通塊的大小,有 g i sum limits ic f jg 化簡得 g i sum limits i fracf jg frac sum limits i frac frac 設 f i frac,g ...