CF2001E1.Deterministic Heap (Easy Version)
提高+/省选-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
这是该问题的简单版本。两个版本的区别在于确定性最大堆的定义、时间限制以及 n 和 t 的约束。只有在两个版本都被解决的情况下,你才能进行 hack。
考虑一个大小为 2n−1 的完美二叉树,节点编号从 1 到 2n−1,根节点为 1。对于每个顶点 v(1≤v≤2n−1−1),顶点 2v 是其左儿子,顶点 2v+1 是其右儿子。每个节点 v 还被赋予一个值 av。
定义操作 pop 如下:
- 初始化变量 v 为 1;
- 重复以下过程,直到顶点 v 是叶子节点(即 2n−1≤v≤2n−1):
- 在 v 的两个子节点中,选择值较大的那个,记为 x;如果它们的值相等(即 a2v=a2v+1),你可以任选其一;
- 将 ax 赋值给 av(即 av:=ax);
- 将 x 赋值给 v(即 v:=x);
- 将 av 赋值为 −1(即 av:=−1)。
当且仅当上述操作有唯一的执行方式时,我们称 pop 操作是确定性的。换句话说,只有在每次选择时 a2v=a2v+1 成立时,pop 操作才是确定性的。
如果对于每个顶点 v(1≤v≤2n−1−1),都有 av≥a2v 且 av≥a2v+1,则称该二叉树为最大堆。
如果对该堆第一次执行 pop 操作时是确定性的,则称该最大堆为确定性最大堆。
初始时,每个顶点 v 的 av:=0(1≤v≤2n−1),你的目标是统计通过恰好执行 k 次如下操作 add 所能得到的不同确定性最大堆的数量:
- 选择一个整数 v(1≤v≤2n−1),并对从 1 到 v 的路径上的每个顶点 x,将 ax 加 1。
如果存在某个节点在两个堆中的值不同,则认为这两个堆是不同的。
由于答案可能很大,请输出对 p 取模的结果。
输入格式
每个测试点包含多个测试用例。第一行包含测试用例数 t(1≤t≤500)。接下来是每个测试用例的描述。
每个测试用例的第一行包含三个整数 n,k,p(1≤n,k≤500,108≤p≤109,p 为质数)。
保证所有测试用例中 n 的和与 k 的和不超过 500。
输出格式
对于每个测试用例,输出一行一个整数,表示通过上述操作恰好 k 次后能得到的不同确定性最大堆的数量,对 p 取模。
输入输出样例
输入#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
说明/提示
对于第一个测试用例,只有一种方式生成 a,且该序列是确定性最大堆,所以答案是 1。
对于第二个测试用例,如果选择 v=1 并执行操作,则 a=[1,0,0],由于 a2=a3,在第一次执行 pop 操作时可以任选其一,因此该堆不是确定性最大堆。
如果选择 v=2,则 a=[1,1,0],第一次执行 pop 时,过程如下:
- 初始化 v 为 1;
- 由于 a2v>a2v+1,选择 2v 作为 x,此时 x=2;
- 将 ax 赋值给 av,此时 a=[1,1,0];
- 将 x 赋值给 v,此时 v=2;
- 由于 v 是叶子节点,将 av 赋值为 −1,此时 a=[1,−1,0]。
由于第一次 pop 操作是确定性的,所以这是一个确定性最大堆。同理,如果选择 v=3,a 也是确定性最大堆,因此答案是 2。
由 ChatGPT 4.1 翻译
输入解题思路,AI测评打分。不知道怎么写?