QOJ.ac

QOJ

実行時間制限: 1 s メモリ制限: 4096 MB 満点: 100 難易度: [表示] インタラクティブ

#13547. 机器

統計

古埃及的计算机科学家们建造了几台可以打乱整数数组的机器。数千年后,考古学家们发现了其中一台机器并对其进行了研究。

该机器接受一个长度为 $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'$ 是所有调用中输入的最大数值。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
#1388EditorialOpenNew Editorial for Problem #13547NuclearPasta2026-04-03 19:40:05View

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.