古埃及的计算机科学家们建造了几台可以打乱整数数组的机器。数千年后,考古学家们发现了其中一台机器并对其进行了研究。
该机器接受一个长度为 $N$ 的整数数组作为输入,并以一种非常可预测的方式运行。它内置了一个由 $0$ 到 $N - 1$ 的数字组成的排列 $P$,用于打乱输入数组。具体来说,$P$ 是一个长度为 $N$ 的数组,其中包含 $0$ 到 $N - 1$(含)之间的每个元素,且每个元素恰好出现一次。
由于腐蚀,该机器不仅会打乱这些数字,还会将它们与某个未知的数字 $X$ 进行按位异或(XOR)。更正式地,该机器接受一个长度为 $N$、由非负整数组成的数组 $A$ 作为输入。然后,它返回另一个长度为 $N$ 的数组 $B$,满足 $B[i] = A[P[i]] \oplus X$($0 \le i < N$),其中 $\oplus$ 表示按位异或运算符。请注意,$X$ 是一个固定常数,在使用机器时不会改变。
两个非负整数 $c$ 和 $d$ 的按位异或计算如下。假设 $c$ 和 $d$ 的二进制表示中最多有 $t$ 位,即 $\max(c, d) < 2^t$。那么 $c \oplus d$ 是一个数字 $z$,其第 $j$ 位($0 \le j < t$)为 $1$ 当且仅当 $c$ 和 $d$ 的第 $j$ 位不同。
考古学家们对内置的排列 $P$ 很感兴趣。你的任务是通过使用该机器来找到 $P$。本题的子任务对你可以使用该机器的次数以及你可以在数组 $A$ 中提供的最大数值做出了限制。
实现细节
你应该实现以下函数:
std::vector<int> find_permutation(int N)
- $N$:$P$ 的长度,以及机器输入和输出的长度。
- 在每个测试用例中,此函数可能会被调用多次。每次调用被称为一个场景(scenario)。
- 此函数应返回内置的排列 $P$。
上述函数可以调用以下函数:
std::vector<int> use_machine(std::vector<int> A)
- $A$:一个长度为 $N$ 的数组,指定给机器的输入。
- $A$ 中的元素必须是 $0$ 到 $2^{15} - 1 = 32767$(含)之间的整数。
- 此函数返回一个数组 $B$,满足 $B[i] = A[P[i]] \oplus X$(对于所有 $0 \le i < N$)。
- 在每个场景中,此函数最多可以被调用 $129$ 次。
设 $T$ 表示测试用例中的场景数量。评测程序(grader)会为每个场景调用一次 find_permutation 函数。
数据范围
- $1 \le T \le 100$
- $3 \le N \le 128$
- $0 \le X \le 255$
- 对于每个满足 $0 \le i < N$ 的 $i$,有 $0 \le P[i] < N$
- 对于所有满足 $0 \le i < j < N$ 的 $i$ 和 $j$,有 $P[i] \neq P[j]$
子任务
设 $Q$ 为允许调用 use_machine 函数的最大次数,$M$ 为可以提供给机器作为输入的最高数值。
| 子任务 | 分值 | 条件 | 附加限制 |
|---|---|---|---|
| 1 | 7 | $Q \le 129$; $M \le 2^{15} - 1$ | |
| 2 | 12 | $Q \le 2$; $M \le 2^{15} - 1$ | |
| 3 | 19 | $Q \le 1$; $M \le 2^{15} - 1$ | |
| 4 | 21 | $Q \le 1$; $M \le 2 \cdot N$ | |
| 5 | 10 | $Q \le 1$; $M \le N + 2$ | $N$ 是奇数 |
| 6 | 31 | $Q \le 1$; $M \le N + 2$ |
样例
样例 1
考虑一个 $P = [0, 1, 2, 3, 4]$ 且 $X = 3$ 的场景。函数 find_permutation 被如下调用:
find_permutation(5)
该函数可以调用 use_machine([6, 6, 2, 9, 5]),其返回 [5, 5, 1, 10, 6]。此时,可以推断出 $X = 3$。然后该函数可以调用 use_machine([1, 8, 4, 0, 4]),其返回 [2, 11, 7, 3, 7]。此时,可以推断出 $P$,因此该函数应返回 [0, 1, 2, 3, 4]。在这个例子中,共对 use_machine 函数进行了 $2$ 次调用,且提供给该函数的最大输入数值为 $9$。
样例 2
考虑一个 $P = [0, 4, 3, 1, 2]$ 且 $X = 8$ 的场景。函数 find_permutation 被如下调用:
find_permutation(5)
该函数可以调用 use_machine([0, 5, 1, 1, 2]),其返回 [8, 10, 9, 13, 9]。根据此输出,可以推断出 $P$,因此该函数应返回 [0, 4, 3, 1, 2]。在这个例子中,仅对 use_machine 函数进行了 $1$ 次调用,且提供给机器的最大输入数值为 $5$。
样例评测程序
样例评测程序输入的第一行包含一个整数 $T$,随后是 $T$ 个场景,格式如下:
N X P[0] P[1] ... P[N-1]
样例评测程序输出这 $T$ 个场景的结果,每个场景的格式如下:
S R[0] R[1] ... R[S-1] Q' M'
这里,$R$ 是 find_permutation 返回的数组,$S$ 是其长度。$Q'$ 是调用 use_machine 的次数,$M'$ 是所有调用中输入的最大数值。