DTOJ 树的解构

题目

Mivik 喜欢 Eprom 的解构俱乐部,于是他想解构一棵树。

Mivik 找到了一棵以 1 1 1 为根的有 n n n 个结点的有根外向树。Mivik 会进行 ( n − 1 ) (n − 1) (n1) 次操作,每次 Mivik 都会从未删掉的边中等概率选择一条边将其删去。记这条边为 a → b a → b ab,则删去这条边的代价是删边时 b b b 的子树大小(包括 b b b 自己);删去这条边后 b b b 为根的子树会形成一棵新的以 b b b 为根的有根树。

例如,下图是 Mivik 找到的有根树:

如果 Mivik 选了 1 → 2 1 \to 2 12 这条边并将其删去,那么代价是 3 3 3 2 2 2 所在的子树内共有 2 , 4 , 5 2,4,5 2,4,5 三个结点),而后情况会变成这样:

如果 Mivik 此时再删去 2 → 4 2 \to 4 24 这条边,那么代价是 1 1 1 4 4 4 所在的子树内只有 4 4 4 一个结点),
随后情况会变成这样:

Mivik 想知道,他进行这 ( n − 1 ) (n − 1) (n1) 次操作后期望的代价总和是多少。由于 Mivik 不喜欢太大的数,你只需要输出期望的值对 1 0 9 + 7 10^9 + 7 109+7 取模的结果。

数据范围

对于所有测试点,满足 1 ≤ n ≤ 2 × 1 0 6 1 \leq n \leq 2 \times 10^6 1n2×106。保证给出的有根树合法。
每个子任务的具体限制见下表:

子任务编号分值特殊限制
1 1 1 10 10 10 a i = 1 a_i=1 ai=1
2 2 2 15 15 15 a i = i a_i=i ai=i
3 3 3 25 25 25 n ≤ 500 n \leq 500 n500
4 4 4 50 50 50

题解

想到对于从 1 1 1 i i i 的一条链上的答案是互不影响的,所以我们对于一个点 i i i 考虑其对答案的贡献。
显然, 设 S i = a 1 , a 2 … , a i S_i=a_1,a_2 \dots,a_i Si=a1,a2,ai 为边的数量为 i i i 的 删边顺序的排列(这里的 a i a_i ai是按照从根到 i i i 的边的顺序来排的,即 a i = k a_i=k ai=k, k k k为第 k k k条边)。我们只要统计其中的有效删边(会把 i i i计算进去的删边)的边数即为答案。
显然,如果 a i > a j , i < j , a_i>a_j,i<j, ai>aj,i<j那么 i i i 就不会被计算到。于是 S S S 的答案即为排列中单调栈的大小。
然后我们考虑怎么求其单调栈的大小:
对于一个数 x x x,显然,只有 1 ∣ S ∣ − x + 1 \frac{1}{|S|-x+1} Sx+11的概率会在 x x x 的前面选到比x大的数,所以对于 S i S_i Si的所有排列的答案即为 ∣ S ∣ ! × ∑ i = 1 ∣ S ∣ 1 i |S|! \times \sum_{i=1}^{|S|} \frac{1}{i} S!×i=1Si1
所以对于所有的点 i i i ,其删边排列大小为 d e p i dep_i depi,( d e p i dep_i depi i i i 的深度, d e p 1 = 0 dep_1=0 dep1=0(想一想为什么))。
于是答案就是 ∑ i = 2 n ∑ j = 1 d e p i 1 j \sum_{i=2}^{n}\sum_{j=1}^{dep_i} \frac{1}{j} i=2nj=1depij1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值