做模擬賽的時候碰到了,感覺稍微有點意思,寫來自己看。
【無標號有根樹】 設f
n 表示樹的大小為
n 的方案數,其生成函式f(
z)=∑
n>0f
nzn。
考慮生成函式的組合意義,fn
+1可以由若干個無序的不同大小的「若干個無序的相同大小的本質不同的子樹」拼成,對於大小為
k 的樹,作為多棵子樹時他可以貢獻的不同樹形態的生成函式是(∑
jzjk
)fk=
(1−z
k)−f
k,再將所有不同大小的子樹拼起來,得∏n
>0(
1−zn
)−fn
,所以f(
z)=z
∏n>01
1−zn
fn。當然我們可以用同樣的思路得到生成函式的另乙個形式是z∏
n>
0expf(
zn) ,但是我並不能從這個形式往後推出什麼。。。
考慮對f(z
) 兩邊取對數並求導,有f′
(z)f
(z)=
1z+∑
n>0f
nnzn
−11−
zn乘一乘得 zf
′(z)
=f(z
)+(∑
n>0f
nnzn
1−zn
)f(z
) 對應係數有 nf
n=fn
+∑j>0f
j[zn
−j]∑
k(kf
kzk1
−zk)
考慮[z
n]zk
1−zk
的取值,注意到後面的函式是∑∞
j=k[
k∣j]
zj,所以[z
n]zk
1−zk
=[k∣
n],所以 (n
−1)f
n=∑j
=1n−
1fj∑
k∣n−
jkfk
後面可以每次更新的時候存下來,所以直接遞推複雜度是o(
n2) 的。
分治fft之後可以做到o(
nlog2n
) 。【無標號無根樹】 設h
n 表示無根樹的方案,fn
同上。考慮怎麼唯一表示一棵樹,我們可以用重心。那麼我們可以在所有有根樹里去掉根不是重心的情況,即hn
=fn−
∑⌊n/
2⌋k=
1fkf
n−k ,當
n 為偶數時可能會有兩個重心,所以加回f2
n/2−
(fn/
22)=
(fn/
2+12
)。 求出f
之後算單個h是
o(n)
的。也可以卷積然後減一減。
無標號無根樹計數
這道題題解區有很多神仙題解,講解得很全面,本篇題解僅做一些細節補充和 實現方面的講解。求 n 個點的無標號無根樹數量,答案對 998,244,353 取模。1 le n le 2 times10 5 注意到無根樹這個限制比較噁心,因為對於一棵樹我們總要找個根才好處理各種東西。所以考慮先計算無標號有根...
有標號DAG計數 生成函式
luogu 首先考慮暴力,很容易得出 f i sum limits 1 binom 2 f i j 相當於列舉度數為0的節點的個數,向不在這個集合裡的點任意連邊,之後需要容斥。考慮如何優化。j i j frac frac frac f i sum limits 1 frac frac sqrt f ...
生成樹計數
考慮簡單帶權無向圖的情況。約定這張圖為 g v,e n v m e e i u i,v i,w i 表示第 i 條邊,deg u 表示 u 所連邊的邊權和。mathbf a 滿足 mathbf a w i,j mathbf d 滿足 mathbf d i j deg i mathbf b 滿足 ma...