CF2018F3 Speedbreaker Counting (Hard Version)

题目描述

[DRG - Limbo](https://soundcloud.com/drg72711/limbo) ⠀ 这是该问题的困难版本。在三个版本中,$ n $ 的限制和时间限制不同。只有当你解决了所有版本的问题后,才能进行 hack。 以下是 D1B 问题的描述: - 有 $ n $ 个城市排成一行,从左到右编号为 $ 1, 2, \ldots, n $。 - 在第 $ 1 $ 时刻,你征服恰好一个城市,称为起始城市。 - 在第 $ 2, 3, \ldots, n $ 时刻,你可以选择一个与已征服城市相邻的城市并征服它。 如果对于每个 $ i $,你在不晚于 $ a_i $ 的时刻征服了城市 $ i $,则你获胜。是否存在获胜策略,也取决于起始城市。问有多少个起始城市可以让你获胜? 对于每个 $ 0 \leq k \leq n $,统计有多少个正整数数组 $ a_1, a_2, \ldots, a_n $ 满足: - 对于每个 $ 1 \leq i \leq n $,$ 1 \leq a_i \leq n $; - D1B 问题的答案为 $ k $。 答案可能非常大,因此你需要对给定的质数 $ p $ 取模后输出。

输入格式

每组测试数据包含多组测试用例。第一行包含测试用例数 $ t $($ 1 \le t \le 3000 $)。接下来是每组测试用例的描述。 每组测试用例的唯一一行包含两个整数 $ n, p $($ 1 \le n \le 3000 $,$ 10^8 \leq p \leq 10^9 $,$ p $ 为质数),表示城市数量和取模的质数。 保证所有测试用例中 $ n $ 的总和不超过 $ 3000 $。

输出格式

对于每组测试用例,输出 $ n+1 $ 个整数:第 $ i $ 个整数表示满足条件且 $ k = i-1 $ 的数组个数。

说明/提示

在第一个测试用例中: - 有 $ 1 $ 个好的起始城市的数组:$ [1] $。 在第二个测试用例中: - 有 $ 0 $ 个好的起始城市的数组:$ [1, 1] $; - 有 $ 1 $ 个好的起始城市的数组:$ [1, 2] $,$ [2, 1] $; - 有 $ 2 $ 个好的起始城市的数组:$ [2, 2] $。 在第三个测试用例中: - 有 $ 0 $ 个好的起始城市的数组:$ [1, 1, 1] $,$ [1, 1, 2] $,$ [1, 1, 3] $,$ [1, 2, 1] $,$ [1, 2, 2] $,$ [1, 3, 1] $,$ [1, 3, 2] $,$ [2, 1, 1] $,$ [2, 1, 2] $,$ [2, 2, 1] $,$ [2, 2, 2] $,$ [2, 3, 1] $,$ [2, 3, 2] $,$ [3, 1, 1] $; - 有 $ 1 $ 个好的起始城市的数组:$ [1, 2, 3] $,$ [1, 3, 3] $,$ [2, 1, 3] $,$ [3, 1, 2] $,$ [3, 1, 3] $,$ [3, 2, 1] $,$ [3, 3, 1] $; - 有 $ 2 $ 个好的起始城市的数组:$ [2, 2, 3] $,$ [2, 3, 3] $,$ [3, 2, 2] $,$ [3, 3, 2] $; - 有 $ 3 $ 个好的起始城市的数组:$ [3, 2, 3] $,$ [3, 3, 3] $。 由 ChatGPT 4.1 翻译