问题描述
给定一个正整数 N 和一个序列 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。
这里,⊕ 表示按位异或。
什么是按位异或?
非负整数 A 和 B 的按位异或,A⊕B,定义如下:
- 当以二进制形式表示 A⊕B 时,2k 位上的数字 (k≥0) 为 1,当且仅当 A 和 B 中恰好有一个数字是 1,否则为 0。
例如,我们有 3⊕5=6(二进制形式为: 011⊕101=110)。
你的目标是使得对于每个 i,Ai=i。判断是否可以实现这个目标。可以证明,在本问题的约束条件下,如果可能,最多可以通过执行 106 次操作来达到目标。输出这样一系列操作。
约束条件
- 1≤N≤18
- 0≤Ai≤2N−1
- Ai=Aj,如果 i=j
输入
输入以以下格式从标准输入给出:
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 应为该操作中选择的整数。
如果有多个可能的解,可以输出其中任意一个。
示例输入 1
3
5 0 3 6 1 4 7 2
示例输出 1
Yes
4
-1 6 -1 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
2 5 4 3 6 1 0 7
示例输出 2
No
没有一系列操作可以达到目标。
示例输入 3
3
0 1 2 3 4 5 6 7
示例输出 3
Yes
0
执行零次操作就可以达到目标。是否打印空行不影响最终结果。