我们周围充斥着各种长数字标识符:银行账号、ISBN 书号、商品条形码等等。这些标识符大多是由人工书写或输入的,为了避免错误,它们通常内置了某种错误检测机制。
错误检测通常以校验和(checksum)的形式实现。例如,ISBN-10 书号是由 10 位数字序列 $a_1, a_2, \dots, a_{10}$ 组成的,其校验和计算如下:
$$10 \times a_1 + 9 \times a_2 + 8 \times a_3 + \dots + 2 \times a_9 + 1 \times a_{10} \pmod{11}$$
校验和是一个介于 0 到 10 之间的数字,对于有效的书号,其校验和始终为 0。由于它是为错误检测而设计的,它具有以下重要特性:
- 如果在保持其他数字不变的情况下改变任意单个数字,校验和会发生变化。
- 如果在保持其余数字不变的情况下交换两个不同的相邻数字,校验和会发生变化。
然而,这种方式并不够“优美”,因为它有 11 种可能的取值,而单个数字只有 10 种可能的取值,因此显得有些冗余。
我们引入“优美校验和”的概念如下:假设我们的标识符是由 $n$ 个整数组成的序列,每个整数都在 $0$ 到 $m-1$(包含边界)之间:$a_1, a_2, \dots, a_n$。校验和算法由两个矩阵 $p_{ij}$ ($0 \le i, j \le m-1$) 和 $q_{ki}$ ($1 \le k \le n, 0 \le i \le m-1$) 定义,其中的值均在 $0$ 到 $m-1$(包含边界)之间。校验和计算如下:
- 令 $s_0 = 0$。
- 对于每个 $k$ 从 $1$ 到 $n$: (a) 令 $t_k = q_{k, a_k}$。 (b) 令 $s_k = p_{s_{k-1}, t_k}$。
- 返回 $s_n$ 的值作为校验和。
换句话说,矩阵 $q$ 定义了每个位置上数字的变换,而矩阵 $p$ 描述了如何组合变换后的数字。如果对于给定的 $n$ 和 $m$,校验和值对于任何序列 $a$ 都满足上述两个特性(即对改变单个数字敏感,且对交换两个不同的相邻数字 $a_k \neq a_{k+1}$ 敏感),则称这两个矩阵 $p$ 和 $q$ 定义了一个优美校验和。
例如,对于 $n=10, m=11$,定义 $p_{ij} = i+j \pmod{11}$,$q_{ki} = (11-k) \times i \pmod{11}$ 即为一个优美校验和。
你能为给定的 $n$ 和 $m$ 找出一个优美校验和吗?
输入格式
输入文件的唯一一行包含两个数字:$n$ 和 $m$,$2 \le n \le 100$,$2 \le m \le 9$。
输出格式
如果对于给定的 $n$ 和 $m$ 存在优美校验和,请在输出文件的第一行打印 Ja,否则打印 Nein。
如果打印了 Ja,请在随后打印校验和的描述。接下来的 $m$ 行打印矩阵 $p$,每行包含 $m$ 个以空格分隔的整数:其中第 $i$ 行(从 0 开始计数)的第 $j$ 个(从 0 开始计数)值应为 $p_{ij}$。接下来的 $n$ 行打印矩阵 $q$,每行包含 $m$ 个以空格分隔的整数:其中第 $k$ 行(从 1 开始计数)的第 $i$ 个(从 0 开始计数)值应为 $q_{ki}$。
你打印的所有数字必须在 $0$ 到 $m-1$(包含边界)之间。如果存在多个可能的解,你可以输出其中任意一个。
样例
输入 1
4 3
输出 1
Ja 0 1 2 1 2 0 2 0 1 0 1 2 0 2 1 0 1 2 0 2 1