题目描述
小 B 八年前看到的桂花树是一棵 n 个节点的树 T,保证 T 的非根结点的父亲的编号小于自己。给定整数 k,称一棵 (n+m) 个节点的有根树 T′ 是繁荣的,当且仅当以下所有条件满足:
- 对于任意满足 1≤i,j≤n 的 (i,j),在树 T 和树 T′ 上,节点 i 和 j 的最近公共祖先编号相同。
- 对于任意满足 1≤i,j≤n+m 的 (i,j),在树 T′ 上,节点 i 和 j 的最近公共祖先编号不超过 max(i,j)+k。
注意题目中所有树的节点均从 1 开始编号,且根结点编号为 1。T′ 不需要满足非根结点的父亲编号小于自己。
小 B 想知道有多少棵 (n+m) 个节点的树是繁荣的,认为两棵树不同当且仅当存在某一个节点在两棵树上的父亲不同。你只输出方案数在模 (109+7) 意义下的值。
输入格式
从文件 tree.in
中读入数据。
本题有多组测试数据。
输入的第一行包含两个整数 c,t,分别表示测试点编号和测试数据组数。c=0 表示该测试点为样例。
接下来依次输入每组测试数据,对于每组测试数据:
输入的第一行包含三个整数 n,m,k。
输入的第二行包含 n−1 个整数 f2,f2,…,fn,其中 fi 表示 T 中节点 i 的父亲节点编号。
输出格式
输出到文件 tree.out
中。
对于每组测试数据输出一行一个整数,表示繁荣的树的数量在模 (109+7) 意义下的答案。
0 3
1 2 1
2 2 1
1
2 2 0
1
3
16
15
样例 1 解释
对于样例中的第一组测试数据,有三棵合法的树,其每个节点的的父亲构成的序列 {f2,f3} 分别为 {1,1}、{3,1}、{1,2}。注意这组测试数据的第二行为空行。
对于样例中的第二组、第三组测试数据,共有 16 棵树满足第一个条件,其中只有父亲序列为 {4,4,1} 的树在第三组测试数据中不满足第二个条件。
样例 2
见选手目录下的 tree2.in
与 tree2.ans
。
该组样例满足 n≤100,五组测试数据中 m 分别不超过 0,1,1,2,2。
样例 3
见选手目录下的 tree3.in
与 tree3.ans
。
该组样例满足 k=0,五组测试数据中前两组测试数据满足 n=1,第一、三、四组测试数据满足 n,m≤100。
样例 4
见选手目录下的 tree4.in
与 tree4.ans
。
该组样例前两组测试数据满足 n=1,第一、三、四组测试数据满足 n,m≤100。
数据范围
对于所有测试数据保证:1≤t≤15,1≤n≤3×104,0≤m≤3000,0≤k≤10,1≤fi≤i−1。
测试点编号 |
n≤ |
m≤ |
k≤ |
1,2 |
4 |
10 |
3 |
3×104 |
0 |
4 |
102 |
1 |
5 |
3×104 |
6 |
102 |
2 |
7 |
3×104 |
8,9 |
1 |
102 |
0 |
10 |
3,000 |
11 |
102 |
10 |
12 |
3,000 |
13,14 |
102 |
0 |
15,16 |
3×104 |
3,000 |
17,18 |
102 |
10 |
19,20 |
3×104 |
3,000 |