#CF2001E1. 确定性堆(简单版)
确定性堆(简单版)
题目翻译
E1. 确定性堆(简单版)
每测试点时间限制:3 秒
内存限制:512 MB
这是问题的简单版本。两个版本的区别在于确定性最大堆的定义、时间限制以及 和 的约束。
只有当两个版本都通过时,你才能进行 hack。
题目描述
考虑一棵大小为 的完美二叉树,节点编号为 到 ,根节点为 。
对于每个节点 (),其左子节点为 ,右子节点为 。
每个节点 有一个值 与之对应。
定义 pop 操作如下:
- 初始化变量 ;
- 重复以下过程直到 为叶子节点(即 ):
- 在 的子节点中,选择值较大的节点,记为 ;若两个子节点值相等(),则可任意选择其一;
- 将 赋值给 (即 );
- 将 赋值给 (即 );
- 将 赋值为 (即 )。
如果该操作只有唯一的方法执行,则称这次 pop 操作是确定性的。
换句话说,在选择子节点时,必须满足 。
一棵二叉树称为 最大堆(max-heap),如果对每个节点 (),都有 且 。
一个最大堆称为确定性的,如果在第一次对它执行 pop 操作时,该操作是确定性的。
初始时,每个节点 的值为 。
你的目标是:计算通过恰好执行 次如下 add 操作能得到的不同确定性最大堆的数量。
add操作:选择一个整数 (),对从 到 路径上的每个节点 ,将 增加 。
两个堆被认为是不同的,如果存在某个节点的值在两个堆中不同。
由于答案可能很大,请输出其对 取模的结果。
输入格式
每个测试包含多个测试用例。
第一行包含一个整数 (),表示测试用例数。
接下来每个测试用例一行,包含三个整数 :
- ,
- ,且 是素数。
保证所有测试用例的 之和 ,且 之和 。
输出格式
对于每个测试用例,输出一行一个整数:通过恰好 次 add 操作能得到的不同确定性最大堆的数量,对 取模。
示例
示例输入 1
7
1 13 998244353
2 1 998244353
3 2 998244853
3 3 998244353
3 4 100000037
4 2 100000039
4 3 100000037
示例输出 1
1
2
12
52
124
32
304
示例输入 2
1
500 500 100000007
示例输出 2
76297230
示例输入 3
6
87 63 100000037
77 77 100000039
100 200 998244353
200 100 998244353
32 59 998244853
1 1 998244353
示例输出 3
26831232
94573603
37147649
847564946
727060898
1
注释
- 第一个测试用例:只有一种方法生成 ,且该序列是确定性最大堆,所以答案是 。
- 第二个测试用例:
如果选择 执行add,得到 ,此时 ,第一次pop时可任选,所以该堆不是确定性的。
如果选择 执行add,得到 :- 第一次
pop时,,唯一选择 , 变为 ,,然后 ,最终 。
该操作是确定性的,所以这是确定性最大堆。
同理 得到的也是确定性最大堆,所以答案是 。
- 第一次