CF2001E2.Deterministic Heap (Hard Version)
省选/NOI-
通过率: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)。
当且仅当上述操作的每一步选择都是唯一的,即任意时刻 a2v=a2v+1,我们称 pop 操作是确定性的。
如果对于每个顶点 v(1≤v≤2n−1−1),都有 av≥a2v 且 av≥a2v+1,则称该二叉树为最大堆(max-heap)。
如果对该堆执行第一次和第二次 pop 操作时,pop 操作都是确定性的,则称该最大堆为确定性最大堆。
初始时,每个顶点 v 的 av:=0(1≤v≤2n−1),你的目标是统计通过恰好执行 k 次如下操作 add 后,能得到多少种不同的确定性最大堆:
- 选择一个整数 v(1≤v≤2n−1),对于从 1 到 v 的路径上的每个顶点 x,将 ax 加 1。
如果存在某个节点在两个堆中的值不同,则认为这两个堆是不同的。
由于答案可能很大,请输出对 p 取模后的结果。
输入格式
每个测试点包含多组测试数据。第一行包含测试数据组数 t(1≤t≤50)。接下来是每组测试数据的描述。
每组测试数据的第一行包含三个整数 n,k,p(2≤n≤100,1≤k≤500,108≤p≤109,p 为质数)。
保证所有测试数据中 n 的和不超过 100,所有测试数据中 k 的和不超过 500。
输出格式
对于每组测试数据,输出一行一个整数,表示通过上述操作恰好得到 k 次后,不同的确定性最大堆的数量,对 p 取模。
输入输出样例
输入#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=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 为 1;
- 由于 a2v<a2v+1,选择 2v+1 作为 x,此时 x=3;
- 将 ax 赋值给 av,此时 a=[0,−1,0];
- 将 x 赋值给 v,此时 v=3;
- v 为叶子节点,将 av 赋值为 −1,此时 a=[0,−1,−1]。
由于第一次和第二次 pop 操作都是确定性的,因此该堆是确定性最大堆。同理,如果选择 v=3,a 也会是确定性最大堆,所以答案为 2。
由 ChatGPT 4.1 翻译
输入解题思路,AI测评打分。不知道怎么写?