#ATagc057c. [AGC057C] Increment or Xor

[AGC057C] Increment or Xor

题目描述

给定一个正整数 NN,以及一个长度为 2N2^N 的数列 A=(A0,A1,,A2N1)A = (A_0, A_1, \ldots, A_{2^N-1})。其中每个 AiA_i002N12^N-1 之间的整数,且对于 iji \neq j,有 AiAjA_i \neq A_j

你可以对数列 AA 进行以下两种操作:

  • 操作 ++:对所有 ii,将 AiA_i 变为 (Ai+1)mod2N(A_i + 1) \bmod 2^N
  • 操作 \oplus:选择一个 002N12^N-1 之间的整数 xx,对所有 ii,将 AiA_i 变为 AixA_i \oplus x

这里的 \oplus 表示按位异或(XOR)操作。

按位异或操作的定义如下:对于非负整数 A,BA, BABA \oplus B 的二进制表示中,每一位 2k2^kk0k \geq 0)的数值,如果 AABB 的该位中只有一个为 11,则为 11,否则为 00

例如,35=63 \oplus 5 = 6(二进制表示为:011101=110011 \oplus 101 = 110)。

你的目标是通过若干次操作,使得对于所有 ii,都有 Ai=iA_i = i。请判断能否达成目标。如果可以,请输出一种不超过 10610^6 次操作的方案。

输入格式

输入通过标准输入给出,格式如下:

NN A0A_0 A1A_1 \ldots A2N1A_{2^N-1}

输出格式

如果存在一种操作序列,使得对于所有 iiAi=iA_i = i,则输出 Yes,否则输出 No

若输出 Yes,请继续输出一组操作序列,格式如下:

KK x1x_1 x2x_2 \ldots xKx_K

其中 KK 表示操作次数,0K1060 \leq K \leq 10^6xix_i 表示第 ii 次操作:

  • 若第 ii 次操作为 ++,则 xi=1x_i = -1
  • 若第 ii 次操作为 \oplus,则 xix_i 为本次操作选择的整数 xx

如果存在多种方案,输出任意一种均可。

样例 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

说明/提示

约束条件

  • 1N181 \leq N \leq 18
  • 0Ai2N10 \leq A_i \leq 2^N - 1
  • 对于 iji \neq j,有 AiAjA_i \neq A_j

样例解释 1

通过输出的操作序列,数列 AA 的变化如下:

  • 初始状态:A=(5,0,3,6,1,4,7,2)A = (5,0,3,6,1,4,7,2)
  • 操作 ++A=(6,1,4,7,2,5,0,3)A = (6,1,4,7,2,5,0,3)
  • 操作 \oplusx=6x = 6):A=(0,7,2,1,4,3,6,5)A = (0,7,2,1,4,3,6,5)
  • 操作 ++A=(1,0,3,2,5,4,7,6)A = (1,0,3,2,5,4,7,6)
  • 操作 \oplusx=1x = 1):A=(0,1,2,3,4,5,6,7)A = (0,1,2,3,4,5,6,7)

样例解释 2

无论如何操作,都无法达成目标。

样例解释 3

无需任何操作即可达成目标。空行的输出与判题结果无关。

由 ChatGPT 4.1 翻译