P14037 [PAIO 2025] XOR multiset
题目背景
**DO NOT** include `xor.h`. Submit using C++ >=17.
题目描述
给定一个整数 $n$ 和 $n-1$ 个非负整数 $a_1, a_2, \dots, a_{n-1}$。
请你找到一个多重集 $S$,其元素均选自 $\{1, 2, \dots, n-1\}$,满足以下要求:
* $\sum_{x \in S} x \equiv 0 \pmod n$;
* $\bigoplus_{x \in S} a_x$ 的值最大,其中 $\bigoplus$ 表示按位异或运算。按位异或运算会作用于两个数的二进制,每一位分别异或。例如 $5$(二进制 $0101$)XOR $3$(二进制 $0011$)的结果是 $6$(二进制 $0110$)。该运算符在 C++、Java 和 Python 中均为 `^`。
如果有多个满足上述要求的多重集,输出任意一个即可。
## 实现要求
你需要实现如下函数:
```
(int64, int32[]) find_multiset(int32 n, int64[] a)
```
* $n$:模数;
* $a$:长度为 $n-1$ 的数组,$a[i]$ 表示 $a_{i+1}$;
* 函数需返回一个二元组:
* 第一个元素为 $\bigoplus_{x \in S} a_x$ 在所有合法 $S$ 中的最大值;
* 第二个元素为满足要求的任意一个最优多重集 $S$。$S$ 的元素范围为 $1$ 到 $n-1$,大小不超过 $2n$。
输入格式
无特殊输入格式说明。
输出格式
无特殊输出格式说明。
说明/提示
## 样例
`find_multiset(3, {5, 10})` 的返回值应为 `{15, {1, 2}}`
* 此时 $n=3$,$a=\{5, 10\}$(即 $a_1=5, a_2=10$)。
* 目标是找到 $S \subseteq \{1, 2\}$,要求 $\sum_{x \in S} x \equiv 0 \pmod 3$。
* 合法多重集如:$\varnothing$(和为 $0$)、$\{1,2\}$(和为 $3 \equiv 0$)、$\{1,1,1\}$(和为 $3 \equiv 0$)、$\{2,2,2\}$(和为 $6 \equiv 0$)等。
* $S = \{1, 2\}$ 时,异或为 $a_1 \oplus a_2 = 5 \oplus 10 = 15$。
* $S = \{1,1,1\}$ 时,异或为 $a_1 \oplus a_1 \oplus a_1 = 5 \oplus 5 \oplus 5 = 5$。
* 最大异或值为 $15$,由 $S = \{1, 2\}$ 达成。
`find_multiset(4, {8, 12, 6})` 的返回值应为 `{14, {1, 3}}`
* 此时 $n=4$,$a=\{8,12,6\}$(即 $a_1=8, a_2=12, a_3=6$)。
* 目标是找到 $S \subseteq \{1, 2, 3\}$,要求 $\sum_{x \in S} x \equiv 0 \pmod 4$。
* $S = \{1, 3\}$ 时,结果为 $a_1 \oplus a_3 = 8 \oplus 6 = 14$。
* $S = \{2, 2\}$ 时,结果为 $a_2 \oplus a_2 = 12 \oplus 12 = 0$。
* 最大异或值为 $14$,由 $S = \{1, 3\}$ 达成。
## 样例评测器
样例评测器输入格式如下:
* 第一行:一个整数 $n$。
* 第二行:$n-1$ 个整数 $a_1,a_2,\dots,a_{n-1}$。
评测器调用 `find_multiset(n, a)` 并输出如下格式:
* 第一行:函数返回对的第一个元素;
* 第二行:多重集的大小;
* 第三行:多重集中的元素(如有),用空格分隔。
**注意**:样例评测器仅供本地测试。正式考试中的评测方式可能有所不同。
# 数据范围
* $1 \le n \le 10^5$
* $0 \le a_i < 2^{62}$,$i = 1,2,\dots,n-1$
# 评分标准
* 子任务1(20分):$n \le 10$
* 子任务2(40分):$n$ 为奇数
* 子任务3(40分):无额外约束
每个子任务,若你输出的最大异或值与标准答案一致且多重集 $S$ 合法且能达到最大值,则可获得该子任务的全部分数。若所有测试点最大异或值正确而 $S$ 任意但合法,则该子任务 60% 得分。其余情况得分为 0%。
由 ChatGPT 5 翻译