CF2001E2.Deterministic Heap (Hard Version)

省选/NOI-

通过率: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)。

当且仅当上述操作的每一步选择都是唯一的,即任意时刻 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},则称该二叉树为最大堆(max-heap)。

如果对该堆执行第一次和第二次 pop\mathrm{pop} 操作时,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≤501 \le t \le 50)。接下来是每组测试数据的描述。

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

保证所有测试数据中 nn 的和不超过 100100,所有测试数据中 kk 的和不超过 500500。

输出格式

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

输入输出样例

  • 输入#1

    6
    2 1 998244353
    3 2 998244853
    3 3 998244353
    3 4 100000037
    4 2 100000039
    4 3 100000037

    输出#1

    2
    12
    40
    100
    32
    224
  • 输入#2

    1
    100 500 100000037

    输出#2

    66681128
  • 输入#3

    2
    87 63 100000037
    13 437 100000039

    输出#3

    83566569
    54517140

说明/提示

对于第一个测试点,如果选择 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} 操作过程如下:

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

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

由 ChatGPT 4.1 翻译

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

首页