TopCoder SRM697 div1 hard【prufer序列】

本文探讨了如何求解特定条件下所有无根生成树的权值之和的问题。通过使用prufer序列和组合数学的方法,给出了详细的解题思路及公式推导过程,并最终提出了一种O(n^2)的时间复杂度解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

n2000n≤2000个城市,每个城市有个权值wiwi,任意两个城市之间的道路数有wiwjwi∗wj条。对于每种生成树,设每个点的度数为didi,其权值定义为di∏di。问所有无根生成树的权值和。答案对109+7109+7取模。

解题思路:

主要说一下思路和推导过程。
考虑生成树中的一条边 (i,j)(i,j)wiwjwi∗wj 种选择,那么一种生成树有 wdii∏widi种同构,所以一种生成树的权值其实是(wdiidi)∏(wididi)

考虑prufer序列,一个prufer序列对应一种无根树,且一个点度数为 aa,就会在序列中出现 a1 次,那么

ans=ai=2n2(n2)!(ai1)!(waiiai)ans=∑∑ai=2n−2(n−2)!∏(ai−1)!∏(wiaiai)
=(n2)!wiai=n21ai![waii(ai+1)]=(n−2)!∏wi∑∑ai=n−21∏ai!∏[wiai(ai+1)]

考虑后半部分怎么算,即

a1++an=n21a1!an!wa11wann(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=n21a1!an!wa11wanna1a2a3w1w2w3a1++an=n231a1!an!wa11wannw1w2w3(w1++wn)n23(n23)!∑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=0n2(1p1<p2<<pkni=1kwpi)(w1++wn)n2k(n2k)!∑k=0n−2(∑1≤p1<p2<⋯<pk≤n∏i=1kwpi)(w1+⋯+wn)n−2−k(n−2−k)!

fkfk表示选 kkwi的乘积和,可以用O(n2)O(n2)的dp预处理出,那么
ans=(n2)!wik=0n2 fk (w1++wn)n2k(n2k)!ans=(n−2)!∏wi∑k=0n−2 fk (w1+⋯+wn)n−2−k(n−2−k)!

时间复杂度O(n2)O(n2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值