CF1545C AquaMoon and Permutations
题目描述
琪露诺准备了 $n$ 个长度为 $n$ 的数组。每个数组都是 $1$ 到 $n$ 的一个排列。这些数组很特殊:对于所有 $1 \leq i \leq n$,如果我们取每个数组的第 $i$ 个元素,组成一个新的长度为 $n$ 的数组,这个新数组也是 $1$ 到 $n$ 的一个排列。换句话说,如果你把这 $n$ 个数组按顺序排列成一个 $n$ 行 $n$ 列的矩阵,这个矩阵就是一个[拉丁方阵](https://en.wikipedia.org/wiki/Latin_square)。
之后,琪露诺又添加了另外 $n$ 个数组,每个数组也是 $1$ 到 $n$ 的一个排列。对于所有 $1 \leq i \leq n$,存在至少一个位置 $1 \leq k \leq n$,使得第 $i$ 个数组和第 $n+i$ 个数组的第 $k$ 个元素相同。注意,编号从 $n+1$ 到 $2n$ 的数组不一定组成拉丁方阵。
此外,琪露诺还确保这 $2n$ 个数组中没有两个数组完全相同。也就是说,对于所有 $1 \leq i < j \leq 2n$,存在至少一个位置 $1 \leq k \leq n$,使得第 $i$ 个数组和第 $j$ 个数组的第 $k$ 个元素不同。
最后,琪露诺将这 $2n$ 个数组的顺序随意打乱。
AquaMoon 称从所有 $2n$ 个数组中选出 $n$ 个数组组成的子集为“好子集”,当且仅当这 $n$ 个数组能组成一个拉丁方阵。
AquaMoon 想知道有多少个好子集。由于答案可能非常大,请输出对 $998\,244\,353$ 取模后的结果。同时,她还想知道任意一个好子集。你能帮她吗?
输入格式
输入包含多组测试数据。第一行包含一个整数 $t$($1 \leq t \leq 100$)——表示测试数据的组数。
每组测试数据的第一行包含一个整数 $n$($5 \leq n \leq 500$)。
接下来 $2n$ 行,每行包含 $n$ 个整数,表示第 $i$ 个数组。
保证所有测试数据中 $n$ 的总和不超过 $500$。
输出格式
对于每组测试数据,输出两行。
第一行输出好子集的个数,对 $998\,244\,353$ 取模。
第二行输出 $n$ 个从 $1$ 到 $2n$ 的整数,表示构成一个好子集的 $n$ 个数组的编号(顺序任意)。如果有多个答案,输出任意一个即可。
说明/提示
在第一个测试用例中,好子集的数量为 $1$。唯一的好子集是编号为 $1$、$2$、$3$、$4$、$5$、$6$、$7$ 的数组。
在第二个测试用例中,好子集的数量为 $2$。分别是 $1$、$3$、$5$、$6$、$10$ 或 $2$、$4$、$7$、$8$、$9$。
由 ChatGPT 4.1 翻译