CF1943D2 Counting Is Fun (Hard Version)

题目描述

这是该问题的困难版本。两个版本的唯一区别在于 $ n $ 的约束条件。只有当两个版本的问题都被解决时,你才能进行 hack。 一个长度为 $ m $ 的非负整数数组 $ b $ 被称为“好”的,如果可以通过以下操作若干次(可能为零次)使得所有 $ b $ 的元素都变为 $ 0 $: - 选择两个不同的下标 $ l $ 和 $ r $($ 1 \leq l < r \leq m $),并对所有满足 $ l \leq i \leq r $ 的 $ b_i $ 减去 $ 1 $。 给定两个正整数 $ n $、$ k $ 和一个质数 $ p $。 在所有长度为 $ n $ 的数组 $ a $ 中,满足 $ 0 \leq a_i \leq k $($ 1 \leq i \leq n $),统计“好”数组的个数。 由于答案可能很大,你只需要输出答案对 $ p $ 取模的结果。

输入格式

每组测试数据包含多个测试用例。第一行包含一个整数 $ t $($ 1 \leq t \leq 10^3 $)——表示测试用例的数量。接下来是每个测试用例的描述。 每个测试用例的第一行包含三个正整数 $ n $、$ k $ 和 $ p $($ 3 \leq n \leq 3000 $,$ 1 \leq k \leq n $,$ 10^8 < p < 10^9 $)——数组 $ a $ 的长度、$ a $ 元素的上界以及模数 $ p $。 保证所有测试用例中 $ n^2 $ 的和不超过 $ 10^7 $,且 $ p $ 是质数。

输出格式

对于每个测试用例,输出一行,表示好数组的个数对 $ p $ 取模的结果。

说明/提示

在第一个测试用例中,$ 4 $ 个好数组 $ a $ 分别为: - $ [0,0,0] $; - $ [0,1,1] $; - $ [1,1,0] $; - $ [1,1,1] $。 由 ChatGPT 4.1 翻译