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