atcoder#AGC057C. [AGC057C] Increment or Xor

[AGC057C] Increment or Xor

配点 : 11001100

問題文

正整数 NN および、2N2^N 項からなる数列 A=(A0,A1,,A2N1)A = (A_0, A_1, \ldots, A_{2^N-1}) が与えられます。ここで各 AiA_i00 以上 2N12^N-1 以下の整数であり、iji\neq j ならば AiAjA_i\neq A_j が成り立ちます。

あなたは数列 AA に対して、次の 22 種類の操作を行うことができます:

  • 操作 ++:すべての ii に対して、AiA_i(Ai+1)mod2N(A_i + 1) \bmod 2^N に変更する。
  • 操作 \oplus00 以上 2N12^N-1 以下の整数 xx を選ぶ。すべての ii に対して AiA_iAixA_i\oplus x に変更する。

ただしここで、\oplus はビット単位 XOR\mathrm{XOR} 演算を表します。

ビット単位 $\mathrm{XOR}$ 演算とは

非負整数 A,BA, B のビット単位 XOR\mathrm{XOR}ABA \oplus B は、以下のように定義されます。

  • ABA \oplus B を二進表記した際の 2k2^k (k0k \geq 0) の位の数は、A,BA, B を二進表記した際の 2k2^k の位の数のうち一方のみが 11 であれば 11、そうでなければ 00 である。
3 \oplus 5 = 6$$$$011 \oplus 101 = 110
あなたの目的は、すべての $i$ に対して $A_i = i$ が成り立つようにすることです。目的を達成することが可能であるかを判定してください。本問題の制約下では、目的を達成することが可能な場合には、操作回数を $10^6$ 回以下にできることが証明できます。そのような操作列を出力してください。

制約

  • 1N181\leq N\leq 18
  • 0Ai2N10\leq A_i \leq 2^N - 1
  • iji\neq j ならば AiAjA_i\neq A_j

入力

入力は以下の形式で標準入力から与えられます。

NN

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

出力

すべての ii に対して Ai=iA_i = i が成り立つようにすることが可能ならば Yes、そうでなければ No を出力してください。

Yes の場合には、さらに目的を達成するための操作列を次の形式で出力してください。

KK

x1x_1 x2x_2 \ldots xKx_K

ここで KK は操作の回数を表す非負整数で、0K1060\leq K\leq 10^6 を満たす必要があります。また、xix_iii 回目の操作を表す整数で、

  • ii 回目に操作 ++ を行う場合には、xi=1x_i=-1
  • ii 回目に操作 \oplus を行う場合には、xix_i はその操作で選ぶ整数 xx

と定めてください。

答が複数考えられる場合には、そのどれを出力しても正解となります。

3
5 0 3 6 1 4 7 2
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)
  • 操作 \oplus (x=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)
  • 操作 \oplus (x=1x = 1):A=(0,1,2,3,4,5,6,7)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

00 回の操作により目的が達成できます。なお、空行の出力の有無は、ジャッジ結果に影響しません。