题目描述
给定一个正整数 N,以及一个长度为 2N 的数列 A=(A0,A1,…,A2N−1)。其中每个 Ai 是 0 到 2N−1 之间的整数,且对于 i=j,有 Ai=Aj。
你可以对数列 A 进行以下两种操作:
- 操作 +:对所有 i,将 Ai 变为 (Ai+1)mod2N。
- 操作 ⊕:选择一个 0 到 2N−1 之间的整数 x,对所有 i,将 Ai 变为 Ai⊕x。
这里的 ⊕ 表示按位异或(XOR)操作。
按位异或操作的定义如下:对于非负整数 A,B,A⊕B 的二进制表示中,每一位 2k(k≥0)的数值,如果 A 和 B 的该位中只有一个为 1,则为 1,否则为 0。
例如,3⊕5=6(二进制表示为:011⊕101=110)。
你的目标是通过若干次操作,使得对于所有 i,都有 Ai=i。请判断能否达成目标。如果可以,请输出一种不超过 106 次操作的方案。
输入格式
输入通过标准输入给出,格式如下:
N A0 A1 … A2N−1
输出格式
如果存在一种操作序列,使得对于所有 i,Ai=i,则输出 Yes,否则输出 No。
若输出 Yes,请继续输出一组操作序列,格式如下:
K x1 x2 … xK
其中 K 表示操作次数,0≤K≤106。xi 表示第 i 次操作:
- 若第 i 次操作为 +,则 xi=−1;
- 若第 i 次操作为 ⊕,则 xi 为本次操作选择的整数 x。
如果存在多种方案,输出任意一种均可。
样例 1
输入
3
5 0 3 6 1 4 7 2
输出
Yes
4
-1 6 -1 1
样例 2
输入
3
2 5 4 3 6 1 0 7
输出
No
样例 3
输入
3
0 1 2 3 4 5 6 7
输出
Yes
0
说明/提示
约束条件
- 1≤N≤18
- 0≤Ai≤2N−1
- 对于 i=j,有 Ai=Aj
样例解释 1
通过输出的操作序列,数列 A 的变化如下:
- 初始状态:A=(5,0,3,6,1,4,7,2)
- 操作 +:A=(6,1,4,7,2,5,0,3)
- 操作 ⊕(x=6):A=(0,7,2,1,4,3,6,5)
- 操作 +:A=(1,0,3,2,5,4,7,6)
- 操作 ⊕(x=1):A=(0,1,2,3,4,5,6,7)
样例解释 2
无论如何操作,都无法达成目标。
样例解释 3
无需任何操作即可达成目标。空行的输出与判题结果无关。
由 ChatGPT 4.1 翻译