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