ccf#NOI2024E. 登山(mountain)
登山(mountain)
题目描述
“为什么要攀登?因为山就在那里。”
慕士塔格山上有 处点位,点从 到 编号, 号点位为山顶。这 个点位构成一棵有根树的结构,其中 号点位为根,对于 , 号点位的父亲结点为 号点位。
记 为 号点位到山顶所需经过的边数。形式化地说,,对于 ,。
定义一条 登山路径 为从 号点位中的某一个开始,经过若干次 移动 后 到达山顶 的方案。
定义一次从 ()号点位出发的 移动 为以下两种方式之一:
- 冲刺:在给定的冲刺范围 内,选择一个正整数 满足 ,向山顶移动 步,即移动至 号点位在有根树上的 级父亲处。保证 。
- 休息:由于慕士塔格山地形陡峭,休息时会滑落到某一个儿子结点处。形式化地说,选择一个满足 的 ,移动至到 号点位。特别地,若 号点位为有根树的叶子结点,则不存在满足 的 ,因此此时不能选择休息。
定义一条 登山路径 对应的 登山序列 为初始点位及每次 移动 到的点位所构成的序列。形式化地说,一条从 号点位开始的 登山路径 对应的 登山序列 是一个点序列 满足对于 , 是 的 ()级组先或 。
为了保证每次冲刺都能更接近山顶,一条 合法的登山路径 需要满足:对于初始点位或某次移动到的点位 ,以后冲刺到的点位 都必须满足 ,其中 是一个给定的参数。保证 。形式化地说,一条 合法的登山路径 对应的 登山序列 需要满足:对于所有 ,若 d_{a_j} < d_{a_i} − h_{a_i}$。
对于 号所有点位,求从这些点位开始的 合法的登山路径 条数。两条 登山路径 不同当且仅当其对应的 登山序列 不同。由于答案可能较大,你只需要求出答案对 取模后的结果。
输入格式
从文件 mountain.in
中读入数据。
本题有多组测试数据。
输入的第一行包含一个整数 ,表示测试点编号。 表示该测试点为样例。
输入的第二行包含一个整数 ,表示测试数据组数。
接下来依次输入每组测试数据,对于每组测试数据:
输入的第一行包含一个整数 ,表示慕士塔格山的点位数量。
接下来 行,第 ()行包含四个整数 。保证 ,,。
输出格式
输出到文件 mountain.out
中。
对于每组测试数据,输出一行 个整数,分别表示从点位 到达山顶的方案数对 取模后的结果。
0
3
5
1 1 1 0
2 1 1 0
2 1 2 1
4 2 3 0
6
1 1 1 0
2 1 2 0
3 1 3 2
4 1 4 1
5 1 5 3
6
1 1 1 0
2 1 2 0
2 1 2 0
3 1 2 0
3 2 3 2
3 3 2 4
5 9 3 21 6
4 10 5 14 1
样例 1 解释
样例 1 共包含三组测试数据。
对于第一组测试数据,慕士塔格山的点位结构如下:
在该测试数据中:,,,。
从 开始的合法的登山路径共有以下 条:
- 直接选择冲刺到 的 级父亲,也就是 ,到达山顶。对应的登山序列为 。
- 先休息滑落到 ;然后从 冲刺到它的 级父亲,到达山顶。对应的登山序列为 。
从 开始的合法的登山路径共有以下 条:
- 直接选择冲刺到 的 级父亲,也就是 ,到达山顶。对应的登山序列为 。
- 先冲刺到 的 级父亲,也就是 ;然后再从 冲刺到它的 级父亲,到达山顶。对应的登山序列为 。
- 先冲刺到 的 级父亲,也就是 ;然后在 处休息,滑落到 ;接着从 冲刺到它的 级父亲,到达山顶。对应的登山序列为 。
- 先冲刺到 的 级父亲,也就是 ;然后在 处休息,滑落到 ;继续休息,滑落到 ;接着从 再次冲刺到它的 级父亲,到达山顶。对应的登山序列为 。
样例 2
见选手目录下的 mountain/mountain2.in
与 mountain/mountain2.ans
。
这个样例满足测试点 的约束条件。
样例 3
见选手目录下的 mountain/mountain3.in
与 mountain/mountain3.ans
。
这个样例满足测试点 的约束条件。
样例 4
见选手目录下的 mountain/mountain4.in
与 mountain/mountain4.ans
。
这个样例满足测试点 的约束条件。
样例 5
见选手目录下的 mountain/mountain5.in
与 mountain/mountain5.ans
。
这个样例满足测试点 的约束条件。
数据范围
对于所有测试数据保证:,。
对于任意的 ,保证:,,。
测试点编号 | 是否有 | 是否有 | 是否有 | |
---|---|---|---|---|
否 | ||||
是 | 是 | 是 | ||
否 | ||||
否 | 是 | |||
否 | ||||
否 | 是 | 是 | ||
否 | ||||
否 | 是 | |||
否 |