1. 程式人生 > >清華集訓2017 生成樹計數

清華集訓2017 生成樹計數

題意:

給定 n n 個連通塊,每個連通塊的大小為 a i a_i ,接下來依次連 n

1 n-1 條邊,得到的樹 T T 的價值定義為:
v a
l ( T ) = ( i
= 1
n
d i m )
( i = 1 n d i m ) val(T)=\left(\prod_{i=1}^nd_i^m\right)\left(\sum_{i=1}^nd_i^m\right)

其中, d i d_i 表示與第 i i 個連通塊連線的邊的條數。請求出所有不同連邊方式產生的樹的價值和膜 998244353 998244353 .
n 30 , 000 , m 30 n\le30,000,m\le30

前置技能:求數列 k k 次方和。

給定 k k ,對於任意的 0 t k 0\le t\le k ,求出 i = 1 n a i t \sum\limits_{i=1}^na_i^t k , n 1 0 5 k,n\le 10^5
考慮答案的生成函式 F ( x ) = t = 0 k x t i = 1 n a i t = i = 1 n 1 1 x a i F(x)=\sum\limits_{t=0}^kx^t\sum\limits_{i=1}^na_i^t=\sum\limits_{i=1}^n\frac{1}{1-xa_i} .
直接計算仍然是不行的,注意到 ln ( 1 a i x ) = a i 1 a i x = t = 0 ( a i x ) t a i \ln'(1-a_ix)=\frac{-a_i}{1-a_ix}=-\sum\limits_{t=0}^\infty(a_ix)^ta_i
因此考慮先計算 G ( x ) = t = 0 k x t i = 1 n a i t + 1 G(x)=-\sum\limits_{t=0}^kx^t\sum\limits_{i=1}^na_i^{t+1} ,則 F ( x ) = x G ( x ) + n F(x)=-xG(x)+n 。化簡 G ( x ) G(x)
G ( x ) = i = 1 n ln ( 1 a i x ) = ln ( i = 1 n ( 1 a i x ) ) G(x)=\sum\limits_{i=1}^n\ln'(1-a_ix)=\ln'\left(\prod_{i=1}^n(1-a_ix)\right)
括號內的東西分治NTT即可,然後多項式求ln再求導,即可得到 F ( x ) F(x)

過程

對於每個終方案 T T ,對答案的貢獻為 i = 1 n a i d i d i m i = 1 n d i m \prod\limits_{i=1}^na_i^{d_i}d_i^m\sum\limits_{i=1}^nd_i^m
由於出現了度數,我們考慮使用prufer序列化簡算式。總貢獻等價於:
( n 2 ) ! d i = n 2 i = 1 n a i d i