無標號生成樹計數

2021-08-01 23:59:42 字數 1441 閱讀 7188

做模擬賽的時候碰到了,感覺稍微有點意思,寫來自己看。

【無標號有根樹】 設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...