#P14037. [PAIO 2025] XOR multiset

[PAIO 2025] XOR multiset

题目描述

给定一个整数 nn 和 n−1n-1 个非负整数 a1,a2,…,an−1a_1, a_2, \dots, a_{n-1}。

请你找到一个多重集 SS,其元素均选自 {1,2,…,n−1}\{1, 2, \dots, n-1\},满足以下要求:

  • ∑x∈Sx≡0(modn)\sum_{x \in S} x \equiv 0 \pmod n;
  • ⨁x∈Sax\bigoplus_{x \in S} a_x 的值最大,其中 ⨁\bigoplus 表示按位异或运算。按位异或运算会作用于两个数的二进制,每一位分别异或。例如 55(二进制 01010101)XOR 33(二进制 00110011)的结果是 66(二进制 01100110)。该运算符在 C++、Java 和 Python 中均为 ^。

如果有多个满足上述要求的多重集,输出任意一个即可。

实现要求

你需要实现如下函数:

(int64, int32[]) find_multiset(int32 n, int64[] a)
  • nn:模数;
  • aa:长度为 n−1n-1 的数组,a[i]a[i] 表示 ai+1a_{i+1};
  • 函数需返回一个二元组:
    • 第一个元素为 ⨁x∈Sax\bigoplus_{x \in S} a_x 在所有合法 SS 中的最大值;
    • 第二个元素为满足要求的任意一个最优多重集 SS。SS 的元素范围为 11 到 n−1n-1,大小不超过 2n2n。

输入格式

无特殊输入格式说明。

输出格式

无特殊输出格式说明。

提示

样例

find_multiset(3, {5, 10}) 的返回值应为 {15, {1, 2}}

  • 此时 n=3n=3,a={5,10}a=\{5, 10\}(即 a1=5,a2=10a_1=5, a_2=10)。
  • 目标是找到 S⊆{1,2}S \subseteq \{1, 2\},要求 ∑x∈Sx≡0(mod3)\sum_{x \in S} x \equiv 0 \pmod 3。
  • 合法多重集如:∅\varnothing(和为 00)、{1,2}\{1,2\}(和为 3≡03 \equiv 0)、{1,1,1}\{1,1,1\}(和为 3≡03 \equiv 0)、{2,2,2}\{2,2,2\}(和为 6≡06 \equiv 0)等。
  • S={1,2}S = \{1, 2\} 时,异或为 a1⊕a2=5⊕10=15a_1 \oplus a_2 = 5 \oplus 10 = 15。
  • S={1,1,1}S = \{1,1,1\} 时,异或为 $a_1 \oplus a_1 \oplus a_1 = 5 \oplus 5 \oplus 5 = 5$。
  • 最大异或值为 1515,由 S={1,2}S = \{1, 2\} 达成。

find_multiset(4, {8, 12, 6}) 的返回值应为 {14, {1, 3}}

  • 此时 n=4n=4,a={8,12,6}a=\{8,12,6\}(即 a1=8,a2=12,a3=6a_1=8, a_2=12, a_3=6)。
  • 目标是找到 S⊆{1,2,3}S \subseteq \{1, 2, 3\},要求 ∑x∈Sx≡0(mod4)\sum_{x \in S} x \equiv 0 \pmod 4。
  • S={1,3}S = \{1, 3\} 时,结果为 a1⊕a3=8⊕6=14a_1 \oplus a_3 = 8 \oplus 6 = 14。
  • S={2,2}S = \{2, 2\} 时,结果为 a2⊕a2=12⊕12=0a_2 \oplus a_2 = 12 \oplus 12 = 0。
  • 最大异或值为 1414,由 S={1,3}S = \{1, 3\} 达成。

样例评测器

样例评测器输入格式如下:

  • 第一行:一个整数 nn。
  • 第二行:n−1n-1 个整数 a1,a2,…,an−1a_1,a_2,\dots,a_{n-1}。

评测器调用 find_multiset(n, a) 并输出如下格式:

  • 第一行:函数返回对的第一个元素;
  • 第二行:多重集的大小;
  • 第三行:多重集中的元素(如有),用空格分隔。

注意:样例评测器仅供本地测试。正式考试中的评测方式可能有所不同。

数据范围

  • 1≤n≤1051 \le n \le 10^5
  • 0≤ai<2620 \le a_i < 2^{62},i=1,2,…,n−1i = 1,2,\dots,n-1

评分标准

  • 子任务1(20分):n≤10n \le 10
  • 子任务2(40分):nn 为奇数
  • 子任务3(40分):无额外约束

每个子任务,若你输出的最大异或值与标准答案一致且多重集 SS 合法且能达到最大值,则可获得该子任务的全部分数。若所有测试点最大异或值正确而 SS 任意但合法,则该子任务 60% 得分。其余情况得分为 0%。

由 ChatGPT 5 翻译