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 翻译