P17394 [ICPC 2018 Shenyang R] Insertion Sort

题目描述

插入排序是一种简单的排序算法,每次迭代构建一个最终有序的数组,一次添加一个元素。 更准确地说,插入排序重复执行以下过程:每次取出一个输入元素,扩大已排序的输出列表。在每次迭代中,插入排序从输入数据中移除一个元素,在已排序列表中查找它应该插入的位置,并将其插入该位置。重复这一过程直到没有输入元素剩余。 这种排序通常采用就地方式进行,即沿着数组向后迭代,在身后扩展已排序的数组。在每个数组位置上,它会检查该位置的值与已排序数组中的最大值(恰好位于刚刚检查过的前一个数组位置上)的大小关系。若更大,则将元素保留在原位,并移动到下一个位置。若更小,则在已排序数组中寻找正确的位置,将所有更大的值向上移动以腾出空位,并将其插入此正确位置。 经过 $k$ 次迭代后得到的数组具有前 $k$ 个元素已排序的性质。每次迭代中,输入的第一个剩余元素被取出,并在结果中的正确位置插入,从而扩展结果。 Knuth 是一位 ACM-ICPC 大师,为你提供了一份插入排序的修改版伪代码实现。对于可排序元素组成的数组 $A$(下标从 $1$ 开始),他修改后的算法可以表述如下: :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/c05v12l1.png) ::: 给定参数 $k$,要求你统计 $1$ 到 $n$ 的所有不同排列中,经过他的修改版插入排序后,每个排列都会变成一个 **几乎有序的排列** 的排列数量。他指出,一个 $1$ 到 $n$ 的排列,如果其最长上升子序列的长度至少为 $(n - 1)$,则该排列是几乎有序的。

输入格式

输入包含多组测试数据,第一行包含一个正整数 $T$,表示测试数据的组数,最多为 $5000$。 对于每组测试数据,唯一的一行包含三个整数 $n, k$ 和 $q$,分别表示排列的长度、他实现中的参数以及输出所需的质数,满足 $1 \leq n, k \leq 50$,$10^8 \leq q \leq 10^9$。

输出格式

对于每组测试数据,输出一行包含 “Case #x: y”(不含引号),其中 $x$ 是测试数据编号(从 $1$ 开始),$y$ 是满足要求的排列数量除以 $q$ 的余数。

说明/提示

在第一个样例中,我们可以发现 $10$ 个满足条件的排列,列举如下: * $[1, 2, 3, 4]$; * $[1, 2, 4, 3]$; * $[1, 3, 2, 4]$; * $[1, 3, 4, 2]$; * $[1, 4, 2, 3]$; * $[2, 1, 3, 4]$; * $[2, 3, 1, 4]$; * $[2, 3, 4, 1]$; * $[3, 1, 2, 4]$; * $[4, 1, 2, 3]$。 翻译由 DeepSeek V4 Pro 完成