CF2001E1.Deterministic Heap (Easy Version)

提高+/省选-

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

这是该问题的简单版本。两个版本的区别在于确定性最大堆的定义、时间限制以及 nn 和 tt 的约束。只有在两个版本都被解决的情况下,你才能进行 hack。

考虑一个大小为 2n−12^n - 1 的完美二叉树,节点编号从 11 到 2n−12^n-1,根节点为 11。对于每个顶点 vv(1≤v≤2n−1−11 \le v \le 2^{n - 1} - 1),顶点 2v2v 是其左儿子,顶点 2v+12v + 1 是其右儿子。每个节点 vv 还被赋予一个值 ava_v。

定义操作 pop\mathrm{pop} 如下:

  1. 初始化变量 vv 为 11;
  2. 重复以下过程,直到顶点 vv 是叶子节点(即 2n−1≤v≤2n−12^{n - 1} \le v \le 2^n - 1):
    1. 在 vv 的两个子节点中,选择值较大的那个,记为 xx;如果它们的值相等(即 a2v=a2v+1a_{2v} = a_{2v + 1}),你可以任选其一;
    2. 将 axa_x 赋值给 ava_v(即 av:=axa_v := a_x);
    3. 将 xx 赋值给 vv(即 v:=xv := x);
  3. 将 ava_v 赋值为 −1-1(即 av:=−1a_v := -1)。

当且仅当上述操作有唯一的执行方式时,我们称 pop\mathrm{pop} 操作是确定性的。换句话说,只有在每次选择时 a2v≠a2v+1a_{2v} \neq a_{2v + 1} 成立时,pop\mathrm{pop} 操作才是确定性的。

如果对于每个顶点 vv(1≤v≤2n−1−11 \le v \le 2^{n - 1} - 1),都有 av≥a2va_v \ge a_{2v} 且 av≥a2v+1a_v \ge a_{2v + 1},则称该二叉树为最大堆。

如果对该堆第一次执行 pop\mathrm{pop} 操作时是确定性的,则称该最大堆为确定性最大堆。

初始时,每个顶点 vv 的 av:=0a_v := 0(1≤v≤2n−11 \le v \le 2^n - 1),你的目标是统计通过恰好执行 kk 次如下操作 add\mathrm{add} 所能得到的不同确定性最大堆的数量:

  • 选择一个整数 vv(1≤v≤2n−11 \le v \le 2^n - 1),并对从 11 到 vv 的路径上的每个顶点 xx,将 axa_x 加 11。

如果存在某个节点在两个堆中的值不同,则认为这两个堆是不同的。

由于答案可能很大,请输出对 pp 取模的结果。

输入格式

每个测试点包含多个测试用例。第一行包含测试用例数 tt(1≤t≤5001 \le t \le 500)。接下来是每个测试用例的描述。

每个测试用例的第一行包含三个整数 n,k,pn, k, p(1≤n,k≤5001 \le n, k \le 500,108≤p≤10910^8 \le p \le 10^9,pp 为质数)。

保证所有测试用例中 nn 的和与 kk 的和不超过 500500。

输出格式

对于每个测试用例,输出一行一个整数,表示通过上述操作恰好 kk 次后能得到的不同确定性最大堆的数量,对 pp 取模。

输入输出样例

  • 输入#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

说明/提示

对于第一个测试用例,只有一种方式生成 aa,且该序列是确定性最大堆,所以答案是 11。

对于第二个测试用例,如果选择 v=1v = 1 并执行操作,则 a=[1,0,0]a = [1, 0, 0],由于 a2=a3a_2 = a_3,在第一次执行 pop\mathrm{pop} 操作时可以任选其一,因此该堆不是确定性最大堆。

如果选择 v=2v = 2,则 a=[1,1,0]a = [1, 1, 0],第一次执行 pop\mathrm{pop} 时,过程如下:

  • 初始化 vv 为 11;
  • 由于 a2v>a2v+1a_{2v} > a_{2v + 1},选择 2v2v 作为 xx,此时 x=2x = 2;
  • 将 axa_x 赋值给 ava_v,此时 a=[1,1,0]a = [1, 1, 0];
  • 将 xx 赋值给 vv,此时 v=2v = 2;
  • 由于 vv 是叶子节点,将 ava_v 赋值为 −1-1,此时 a=[1,−1,0]a = [1, -1, 0]。

由于第一次 pop\mathrm{pop} 操作是确定性的,所以这是一个确定性最大堆。同理,如果选择 v=3v = 3,aa 也是确定性最大堆,因此答案是 22。

由 ChatGPT 4.1 翻译

输入解题思路,AI测评打分。不知道怎么写?

首页