#CF2070D. 树上跳跃
树上跳跃
D. 树上跳跃
每个测试点的时间限制: 秒
每个测试点的内存限制: 兆字节
题目描述
给定一棵有根树,包含 个顶点。顶点编号为 到 ,根为顶点 。
设 为从根到顶点 的距离(最短路径上的边数)。
最初,一枚棋子放在根结点。你可以执行以下操作任意次(包括零次):
- 将棋子从当前顶点 移动到某个顶点 ,满足 。
如果 是根,你可以选择任意满足该约束的顶点 ;
但如果 不是根,则 不能是 的邻居(即 和 之间不能有边直接相连)。
例如,在题目所给的树中,以下移动是可行的:
$$1 \rightarrow 2,\quad 1 \rightarrow 5,\quad 2 \rightarrow 7,\quad 5 \rightarrow 3,\quad 5 \rightarrow 4,\quad 3 \rightarrow 6,\quad 7 \rightarrow 6. $$有效序列定义
一个顶点序列被称为有效,如果存在一种移动棋子的方式,使得棋子按顺序访问序列中的所有顶点(且只访问这些顶点)。
你的任务是计算有效顶点序列的数量。
由于答案可能很大,请输出它对 取模的结果。
输入格式
第一行包含一个整数 ()——测试用例的数量。
每组测试用例:
- 第一行包含一个整数 ()。
- 第二行包含 个整数 (),其中 是顶点 的父结点。顶点 是根。
额外限制:所有测试用例的 之和不超过 。
输出格式
对于每组测试用例,输出一个整数——有效顶点序列的数量,对 取模。
示例
输入
3
4
1 2 1
3
1 2
7
1 2 2 1 4 5
输出
4
2
8
样例解释
第一个样例(,父节点列表:):
有效序列为:
。
共 个。
第二个样例(,父节点列表:):
有效序列为:
。
共 个。
第三个样例(,父节点列表:):
有效序列为:
$[1],\ [1,2],\ [1,2,7],\ [1,2,7,6],\ [1,5],\ [1,5,3],\ [1,5,3,6],\ [1,5,4]$。
共 个。
说明
- 根结点到自身的距离 。
- “不能是邻居”的条件意味着:当 不是根时,不能跳转到 的父结点或子结点,只能跳到“同一层”的其他非相邻顶点,但题目要求 ,所以只能往下一层跳,且不能跳到自己子结点(因为子结点是邻居),因此实际上只能跳到下一层中不是自己孩子的结点。