luogu#P6048. 最优性剪枝
最优性剪枝
题目背景
Nauuo 是一名出题人。
众所周知,某些出题人非常懒,导致随便爆搜加上一个最优性剪枝就能通过。Nauuo 决定把这些 naive 的暴力都卡掉。
题目描述
Nauuo 决定卡一个暴力搜索程序,为此她构建了一组数据。为了简化题目,你将得到这组数据产生的搜索树 。 中包含 个节点,依次编号为 ,其中 号点是 的根节点。一个节点的深度是它到 号点的简单路径上的节点个数。
这个程序的伪代码如下
answer := inf
procedure dfs(node,depth)
if (node is leaf)
answer := min(answer,depth)
return
if (depth < answer)
for i in children of node
dfs(i,depth+1)
dfs(1,1)
其中,:=
表示赋值运算。
翻译成人话就是说,这个暴力搜索程序将深度优先地遍历这棵搜索树,当访问到一个叶节点时,这个程序将用这个叶节点的深度更新答案。
同时,这个程序有一个最优性剪枝,也就是说,当这个程序访问到任意一个深度等于答案的节点时,它将不会再访问这个节点的子节点。
然而,可怜的 Nauuo 并不知道这个程序在某个节点时访问自己子节点的顺序,因此她认为每个节点访问子节点的顺序都是在所有可能的情况中等概率随机的,显然,一共有 种情况,其中 表示 号节点的子节点数量。
现在她想知道这个程序访问到的节点数量的期望,以确定这个程序会不会被自己的数据卡掉。
为了避免浮点误差,答案对 取模。保证答案能被表示为最简分数 ,你只需要输出一个 使得 。
输入格式
第一行一个整数 。
第二行 个整数 ,其中 表示 号节点的父节点编号。
输出格式
一行一个整数,所求 。
4
1 1 3
499122180
3
1 2
3
13
1 1 1 3 5 4 2 3 7 4 4 6
776412285
提示
样例解释
第一组样例的真实答案为 。
一共只有两种情况,如果 号节点先遍历 号节点,则程序将访问到搜索树中所有节点。如果 号节点先遍历 号节点,则 号节点不会被访问到。
第二组样例中,每个非叶节点的子节点都是唯一的,因此只有一种可能的情况,所有节点都必然被访问到。
第三组样例的真实答案为 。
数据范围
「本题采用捆绑测试」
对于所有测试点,保证 ,。
。
。
。
。
。
无特殊限制。
提示
如果你不知道怎么对分数取模,可以参考这里。