题目大意:
有n≤2000n≤2000个城市,每个城市有个权值wiwi,任意两个城市之间的道路数有wi∗wjwi∗wj条。对于每种生成树,设每个点的度数为didi,其权值定义为∏di∏di。问所有无根生成树的权值和。答案对109+7109+7取模。
解题思路:
主要说一下思路和推导过程。
考虑生成树中的一条边 (i,j)(i,j) 有 wi∗wjwi∗wj 种选择,那么一种生成树有 ∏wdii∏widi种同构,所以一种生成树的权值其实是∏(wdiidi)∏(wididi)
考虑prufer序列,一个prufer序列对应一种无根树,且一个点度数为 aa,就会在序列中出现 次,那么
ans=∑∑ai=2n−2(n−2)!∏(ai−1)!∏(waiiai)ans=∑∑ai=2n−2(n−2)!∏(ai−1)!∏(wiaiai)
=(n−2)!∏wi∑∑ai=n−21∏ai!∏[waii(ai+1)]=(n−2)!∏wi∑∑ai=n−21∏ai!∏[wiai(ai+1)]
考虑后半部分怎么算,即
∑a1+⋯+an=n−21a1!⋯an!wa11⋯wann(a1+1)⋯(an+1)∑a1+⋯+an=n−21a1!⋯an!w1a1⋯wnan(a1+1)⋯(an+1)
将(a1+1)⋯(an+1)(a1+1)⋯(an+1)展开,计算每个单项式的贡献,如a1a2a3a1a2a3,那么有:
==∑a1+⋯+an=n−21a1!⋯an!wa11⋯wanna1a2a3w1w2w3∑a1+⋯+an=n−2−31a1!⋯an!wa11⋯wannw1w2w3(w1+⋯+wn)n−2−3(n−2−3)!∑a1+⋯+an=n−21a1!⋯an!w1a1⋯wnana1a2a3=w1w2w3∑a1+⋯+an=n−2−31a1!⋯an!w1a1⋯wnan=w1w2w3(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)!∑k=0n−2(∑1≤p1<p2<⋯<pk≤n∏i=1kwpi)(w1+⋯+wn)n−2−k(n−2−k)!
设fkfk表示选 kk 个 的乘积和,可以用O(n2)O(n2)的dp预处理出,那么
ans=(n−2)!∏wi∑k=0n−2 fk (w1+⋯+wn)n−2−k(n−2−k)!ans=(n−2)!∏wi∑k=0n−2 fk (w1+⋯+wn)n−2−k(n−2−k)!
时间复杂度O(n2)O(n2)