#P6048. 最优性剪枝

    ID: 4438 远端评测题 4000ms 500MiB 尝试: 0 已通过: 0 难度: 6 上传者: 标签>搜索数学2020线段树剪枝树链剖分,树剖期望

最优性剪枝

题目背景

Nauuo 是一名出题人。

众所周知,某些出题人非常懒,导致随便爆搜加上一个最优性剪枝就能通过。Nauuo 决定把这些 naive 的暴力都卡掉。

题目描述

Nauuo 决定卡一个暴力搜索程序,为此她构建了一组数据。为了简化题目,你将得到这组数据产生的搜索树 TTTT 中包含 nn 个节点,依次编号为 1n1 \sim n,其中 11 号点是 TT 的根节点。一个节点的深度是它到 11 号点的简单路径上的节点个数。

这个程序的伪代码如下

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 并不知道这个程序在某个节点时访问自己子节点的顺序,因此她认为每个节点访问子节点的顺序都是在所有可能的情况中等概率随机的,显然,一共有 di!\prod d_i! 种情况,其中 did_i 表示 ii 号节点的子节点数量。

现在她想知道这个程序访问到的节点数量的期望,以确定这个程序会不会被自己的数据卡掉。

为了避免浮点误差,答案对 998244353998244353 取模。保证答案能被表示为最简分数 pq\frac{p}{q},你只需要输出一个 x(0x<998244353)x (0\leq x < 998244353) 使得 qxp(mod998244353)qx \equiv p \pmod {998244353}

输入格式

第一行一个整数 nn

第二行 n1n-1 个整数 p2,p3pnp_2, p_3 \cdots p_n,其中 pip_i 表示 ii 号节点的父节点编号。

输出格式

一行一个整数,所求 xx

4
1 1 3
499122180
3
1 2
3
13
1 1 1 3 5 4 2 3 7 4 4 6
776412285

提示

样例解释

第一组样例的真实答案为 72\frac{7}{2}

一共只有两种情况,如果 11 号节点先遍历 33 号节点,则程序将访问到搜索树中所有节点。如果 11 号节点先遍历 22 号节点,则 44 号节点不会被访问到。

第二组样例中,每个非叶节点的子节点都是唯一的,因此只有一种可能的情况,所有节点都必然被访问到。

第三组样例的真实答案为 949\frac{94}{9}


数据范围

「本题采用捆绑测试」

对于所有测试点,保证 1n3×1051 \leq n \leq 3\times 10^51pi<i1 \leq p_i < i

Subtask 1 (11 pts)\text{Subtask 1 (11 pts)} n9n \leq 9

Subtask 2 (18 pts)\text{Subtask 2 (18 pts)} n100n \leq 100

Subtask 3 (19 pts)\text{Subtask 3 (19 pts)} n103n\leq 10^3

Subtask 4 (4 pts)\text{Subtask 4 (4 pts)} pi=i1p_i = i-1

Subtask 5 (8 pts)\text{Subtask 5 (8 pts)} pi=i2p_i =\lfloor \frac{i}{2} \rfloor

Subtask 6 (40 pts)\text{Subtask 6 (40 pts)} 无特殊限制。


提示

如果你不知道怎么对分数取模,可以参考这里