P15145 [SWERC 2025] Keygen 3

题目描述

Luke 刚刚发现了一款新的 5D 卡丁车视频游戏。然而,该软件并非免费:为了激活它,你需要提供一个许可证密钥。 Luke 发现,一个有效的许可证密钥必须是一个长度为 $n$ 的排列,且满足以下两个条件: - 它是**双调**的; - 它具有 $m$ 个**循环**。 记 $k$ 为许可证密钥的数量(即满足上述条件的排列的数量)。Luke 是一位利他主义的黑客,因此他想为他的 2000 位朋友提供不同的许可证密钥。但是,$k$ 可能小于 2000。 请帮助 Luke,打印出 $r = \min(k, 2000)$ 个不同的有效许可证密钥。 长度为 $n$ 的一个排列是一个由 $1$ 到 $n$ 的 $n$ 个不同整数以任意顺序组成的数组。例如,$[2, 3, 1, 5, 4]$ 是一个排列,但 $[1, 2, 2]$ 不是排列($2$ 在数组中出现两次),$[1, 3, 4]$ 也不是排列($n = 3$ 但数组中有 $4$)。 一个排列 $p_1, p_2, \ldots, p_n$ 是**双调的**,如果存在一个下标 $i$($1 \le i \le n$)使得 - 对于 $2 \le j \le i$,有 $p_{j-1} \le p_j$; - 对于 $i \le j \le n-1$,有 $p_j \ge p_{j+1}$。 一个**循环**是指满足以下条件的子集 $C \subseteq \{1, 2, \ldots, n\}$: - $C$ 非空; - 若 $x \in C$,则 $p_x \in C$; - $C$ 是极小的,即不存在循环 $C'$ 使得 $C' \subsetneq C$。

输入格式

输入只有一行,包含两个整数 $n, m$($1 \le m \le n \le 100$)—— 排列的长度和目标循环数。

输出格式

第一行输出一个整数 $r$:你将打印的排列数量。注意 $r$ 必须为题目中定义的 $\min(k, 2000)$。 接下来输出 $r$ 行。每行必须包含一个长度为 $n$ 的、具有 $m$ 个循环的双调排列。这些排列必须互不相同。

说明/提示

#### 样例解释 在此样例中,共有 $9$ 个有效的许可证密钥(即长度为 $6$、具有 $3$ 个循环的双调排列)。例如,$[3, 5, 6, 4, 2, 1]$ 是双调的(在上述定义中,$i = 3$),并且它有 $3$ 个循环:$\{1, 3, 6\}$、$\{2, 5\}$、$\{4\}$。因此你需要打印 $r = \min(9, 2000) = 9$ 个这样的排列。 翻译由 DeepSeek 完成