BZOJ3456 城市規劃(多項式求逆 NTT)

2022-05-14 14:00:12 字數 1789 閱讀 8905

點此看題面

大致題意:求出\(n\)個點的簡單(無重邊無自環)有標號無向連通圖數目。

在我的想象裡,這道題應該是無比冗長、十分複雜、令人懵逼的題面+極其恐怖、難以理解、又臭又長的式子+分治\(ntt\)+多項式求逆+多項式對數+指數型生成函式+一堆五花八門、亂七八糟的東西

然而真正點開這道題,題面簡潔明瞭(就一句話),題解裡式子推出來我居然也能看得懂,**裡也沒啥亂七八糟的東西,就乙個多項式求逆+\(ntt\)。

或許是我看的題解比較良心?

這是乙個常見的套路。(我也不知道常見不常見,反正我似乎曾遇到過,還被閃指導指導過)

我們設\(f(x)\)為有\(x\)個點的無向連通圖數目(即答案),\(g(x)\)為有\(x\)個點的圖的數目

對於\(g(x)\),我們只要考慮共計\(\frac2\)條邊中每條邊是否連在圖上,即:

\[g(x)=2^2}

\]然後我們就要想辦法把這個式子變複雜讓\(f(x)\)和\(g(x)\)扯上關係。

如果我們對於\(1\)號點,去列舉它所在的連通塊大小,那麼就有:

\[g(x)=\sum_^xc_^f(i)g(x-i)

\]即,從剩餘的共\(n-1\)個節點擊出\(i-1\)個點與\(1\)號點拼成連通塊,而其他的點可以隨意。

接下來這一步我可以確信是乙個常見套路,就是拆了組合數(此處我們順便代入\(g(x)\)的值),得到:

\[2^2}=\sum_^x\fracf(i)2^2}

\]移項,得到:

\[\frac2}}=\sum_^x\frac\cdot\frac2}}

\]然後我們就發現每一項都有著自己對應的下標,即設(其中\(f(x)[i]\)表示函式\(f(x)\)的\(i\)次項係數):

\[f(x)[i]=\frac(i\ge 1)

\]\[g(x)[i]=\frac2}}(i\ge 0)

\]\[h(x)[i]=\frac2}}(i\ge 1)

\]則我們發現原式相當於:(此處用\(n\)替換上式的\(x\),以免定義重複)

\[h(x)[n]=\sum_^nf(x)[i]\cdot g(x)[n-i]

\]顯然這就是乙個卷積的形式,得到:

\[h=f*g

\]那麼就有:

\[f=h*g^

\]因此直接先預處理出\(g,h\),然後多項式求逆+\(ntt\)求出\(f\),則\(f(n)=f(x)[n]\times(n-1)!\),這樣一來就搞定了。

#include#define tp template#define ts template#define reg register

#define ri reg int

#define con const

#define ci con int&

#define i inline

#define w while

#define n 130000

#define x 1004535809

#define qi(x) qp(x,x-2)

using namespace std;

int n,g[n<<2],g_[n<<2],h[n<<2],fac[n+5],ifac[n+5];

i int qp(ri x,ri y)

class poly//多項式模板

}p;int main()

bzoj3456 城市規劃 多項式,分治

description 剛剛解決完電力網路的問題,阿狸又被領導的任務給難住了.剛才說過,阿狸的國家有n個城市,現在國家需要在某些城市對之間建立一些 路線,使得整個國家的任意兩個城市都直接或間接的連通.為了省錢,每兩個城市之間最多只能有一條直接的 路徑.對於兩個建立路線的方案,如果存在乙個城市對,在兩...

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