#agc057c. [agc057_c]Increment or Xor

[agc057_c]Increment or Xor

问题描述

给定一个正整数 NN 和一个序列 A=(A0,A1,,A2N1)A = (A_0, A_1, \ldots, A_{2^N-1}),其中每个 AiA_i 是一个介于 002N12^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 表示按位异或。

什么是按位异或?

非负整数 AABB 的按位异或,ABA \oplus B,定义如下:

  • 当以二进制形式表示 ABA \oplus B 时,2k2^k 位上的数字 (k0k \geq 0) 为 11,当且仅当 AABB 中恰好有一个数字是 11,否则为 00

例如,我们有 35=63 \oplus 5 = 6(二进制形式为: 011101=110011 \oplus 101 = 110)。

你的目标是使得对于每个 iiAi=iA_i = i。判断是否可以实现这个目标。可以证明,在本问题的约束条件下,如果可能,最多可以通过执行 10610^6 次操作来达到目标。输出这样一系列操作。

约束条件

  • 1N181\leq N\leq 18
  • 0Ai2N10\leq A_i \leq 2^N - 1
  • AiAjA_i\neq A_j,如果 iji\neq j

输入

输入以以下格式从标准输入给出:

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 次操作是操作 \oplusxix_i 应为该操作中选择的整数。

如果有多个可能的解,可以输出其中任意一个。


示例输入 1

3
5 0 3 6 1 4 7 2

示例输出 1

Yes
4
-1 6 -1 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
2 5 4 3 6 1 0 7

示例输出 2

No

没有一系列操作可以达到目标。


示例输入 3

3
0 1 2 3 4 5 6 7

示例输出 3

Yes
0

执行零次操作就可以达到目标。是否打印空行不影响最终结果。