TopCoder SRM697 div1 hard【prufer序列】

题目大意:

n2000 n ≤ 2000 个城市,每个城市有个权值 wi w i ,任意两个城市之间的道路数有 wiwj w i ∗ w j 条。对于每种生成树,设每个点的度数为 di d i ,其权值定义为 di ∏ d i 。问所有无根生成树的权值和。答案对 109+7 10 9 + 7 取模。

解题思路:

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

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

ans=ai=2n2(n2)!(ai1)!(waiiai) a n s = ∑ ∑ a i = 2 n − 2 ( n − 2 ) ! ∏ ( a i − 1 ) ! ∏ ( w i a i a i )
=(n2)!wiai=n21ai![waii(ai+1)] = ( n − 2 ) ! ∏ w i ∑ ∑ a i = n − 2 1 ∏ a i ! ∏ [ w i a i ( a i + 1 ) ]

考虑后半部分怎么算,即

a1++an=n21a1!an!wa11wann(a1+1)(an+1) ∑ a 1 + ⋯ + a n = n − 2 1 a 1 ! ⋯ a n ! w 1 a 1 ⋯ w n a n ( a 1 + 1 ) ⋯ ( a n + 1 )

(a1+1)(an+1) ( a 1 + 1 ) ⋯ ( a n + 1 ) 展开,计算每个单项式的贡献,如 a1a2a3 a 1 a 2 a 3 ,那么有:

==a1++an=n21a1!an!wa11wanna1a2a3w1w2w3a1++an=n231a1!an!wa11wannw1w2w3(w1++wn)n23(n23)! ∑ a 1 + ⋯ + a n = n − 2 1 a 1 ! ⋯ a n ! w 1 a 1 ⋯ w n a n a 1 a 2 a 3 = w 1 w 2 w 3 ∑ a 1 + ⋯ + a n = n − 2 − 3 1 a 1 ! ⋯ a n ! w 1 a 1 ⋯ w n a n = w 1 w 2 w 3 ( w 1 + ⋯ + w n ) n − 2 − 3 ( n − 2 − 3 ) !

据此,我们可以推断出,原式就等于:

k=0n2(1p1<p2<<pkni=1kwpi)(w1++wn)n2k(n2k)! ∑ k = 0 n − 2 ( ∑ 1 ≤ p 1 < p 2 < ⋯ < p k ≤ n ∏ i = 1 k w p i ) ( w 1 + ⋯ + w n ) n − 2 − k ( n − 2 − k ) !

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值