题目大意
有
n
个城市,每个城市有个权值
n≤2000
题解
因为与度数有关,所以很容易就能套上prufer序列。事实上,答案求的是这个东西:
==∑a1+⋯+an=2n−2(n−2)!(a1−1)!⋯(an−1)!wa11⋯wanna1⋯anw1⋯wn∑a1+⋯+an=n−2(n−2)!a1!⋯an!wa11⋯wann(a1+1)⋯(an+1)w1⋯wn(n−2)!∑a1+⋯+an=n−21a1!⋯an!wa11⋯wann(a1+1)⋯(an+1)
现在相当于要求
∑a1+⋯+an=n−21a1!⋯an!wa11⋯wann(a1+1)⋯(an+1)
我们把 (a1+1)⋯(an+1) 展开,单独考虑每个单项式的贡献,比如说考虑 a1a2a3 ,那么有
==∑a1+⋯+an=n−21a1!⋯an!wa11⋯wanna1a2a3w1w2w3∑a1+⋯+an=n−2−31a1!⋯an!wa11⋯wannw1w2w3(w1+⋯+wn)n−2−3(n−2−3)!
据此,我们可以推断出,原式就等于
∑k=0n−2⎛⎝∑1≤p1<p2<⋯<pk≤n∏i=1kwpi⎞⎠(w1+⋯+wn)n−2−k(n−2−k)!
对于中间那一项,可以用一个 O(n2) Dp直接求,那么整题就做完了。
总结:
1. prufer序列在含度数的生成树计数中异常有用
2. 把式子展开,考虑单项式的贡献