#P15145. [SWERC 2025] Keygen 3

[SWERC 2025] Keygen 3

说明

Luke 刚刚发现了一款新的 5D 卡丁车视频游戏。然而,该软件并非免费:为了激活它,你需要提供一个许可证密钥。

Luke 发现,一个有效的许可证密钥必须是一个长度为 nn 的排列,且满足以下两个条件:

  • 它是双调的;
  • 它具有 mm循环

kk 为许可证密钥的数量(即满足上述条件的排列的数量)。Luke 是一位利他主义的黑客,因此他想为他的 2000 位朋友提供不同的许可证密钥。但是,kk 可能小于 2000。

请帮助 Luke,打印出 r=min(k,2000)r = \min(k, 2000) 个不同的有效许可证密钥。

长度为 nn 的一个排列是一个由 11nnnn 个不同整数以任意顺序组成的数组。例如,[2,3,1,5,4][2, 3, 1, 5, 4] 是一个排列,但 [1,2,2][1, 2, 2] 不是排列(22 在数组中出现两次),[1,3,4][1, 3, 4] 也不是排列(n=3n = 3 但数组中有 44)。

一个排列 p1,p2,,pnp_1, p_2, \ldots, p_n双调的,如果存在一个下标 ii1in1 \le i \le n)使得

  • 对于 2ji2 \le j \le i,有 pj1pjp_{j-1} \le p_j
  • 对于 ijn1i \le j \le n-1,有 pjpj+1p_j \ge p_{j+1}

一个循环是指满足以下条件的子集 C{1,2,,n}C \subseteq \{1, 2, \ldots, n\}

  • CC 非空;
  • xCx \in C,则 pxCp_x \in C
  • CC 是极小的,即不存在循环 CC' 使得 CCC' \subsetneq C

输入格式

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

输出格式

第一行输出一个整数 rr:你将打印的排列数量。注意 rr 必须为题目中定义的 min(k,2000)\min(k, 2000)

接下来输出 rr 行。每行必须包含一个长度为 nn 的、具有 mm 个循环的双调排列。这些排列必须互不相同。

6 3
9
1 4 5 6 3 2
6 5 4 3 2 1
1 2 4 5 6 3
1 2 5 6 4 3
1 3 4 6 5 2
1 5 6 4 3 2
3 5 6 4 2 1
1 3 6 5 4 2
2 6 5 4 3 1

提示

样例解释

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

翻译由 DeepSeek 完成