配点 : 1100 点
問題文
正整数 N および、2N 項からなる数列 A=(A0,A1,…,A2N−1) が与えられます。ここで各 Ai は 0 以上 2N−1 以下の整数であり、i=j ならば Ai=Aj が成り立ちます。
あなたは数列 A に対して、次の 2 種類の操作を行うことができます:
- 操作 +:すべての i に対して、Ai を (Ai+1)mod2N に変更する。
- 操作 ⊕:0 以上 2N−1 以下の整数 x を選ぶ。すべての i に対して Ai を Ai⊕x に変更する。
ただしここで、⊕ はビット単位 XOR 演算を表します。
ビット単位 $\mathrm{XOR}$ 演算とは
非負整数 A,B のビット単位 XOR 、A⊕B は、以下のように定義されます。
- A⊕B を二進表記した際の 2k (k≥0) の位の数は、A,B を二進表記した際の 2k の位の数のうち一方のみが 1 であれば 1、そうでなければ 0 である。
3 \oplus 5 = 6$$$$011 \oplus 101 = 110
あなたの目的は、すべての $i$ に対して $A_i = i$ が成り立つようにすることです。目的を達成することが可能であるかを判定してください。本問題の制約下では、目的を達成することが可能な場合には、操作回数を $10^6$ 回以下にできることが証明できます。そのような操作列を出力してください。
制約
- 1≤N≤18
- 0≤Ai≤2N−1
- i=j ならば Ai=Aj
入力
入力は以下の形式で標準入力から与えられます。
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
と定めてください。
答が複数考えられる場合には、そのどれを出力しても正解となります。
3
5 0 3 6 1 4 7 2
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)
3
2 5 4 3 6 1 0 7
No
どのように操作を行っても、目的を達成することはできません。
3
0 1 2 3 4 5 6 7
Yes
0
0 回の操作により目的が達成できます。なお、空行の出力の有無は、ジャッジ結果に影響しません。