atcoder#AGC057C. [AGC057C] Increment or Xor

[AGC057C] Increment or Xor

题目描述

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

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

  • 操作 + + :すべての i i に対して、Ai A_i (Ai + 1) mod 2N (A_i\ +\ 1)\ \bmod\ 2^N に変更する。
  • 操作 \oplus 0 0 以上 2N1 2^N-1 以下の整数 x x を選ぶ。すべての i i に対して Ai A_i Ai x A_i\oplus\ x に変更する。

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

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

  • A  B A\ \oplus\ B を二進表記した際の 2k 2^k (k  0 k\ \geq\ 0 ) の位の数は、A, B A,\ B を二進表記した際の 2k 2^k の位の数のうち一方のみが 1 1 であれば 1 1 、そうでなければ 0 0 である。

例えば、3  5 = 6 3\ \oplus\ 5\ =\ 6 となります (二進表記すると: 011  101 = 110 011\ \oplus\ 101\ =\ 110 )。
あなたの目的は、すべての i i に対して Ai = i A_i\ =\ i が成り立つようにすることです。目的を達成することが可能であるかを判定してください。本問題の制約下では、目的を達成することが可能な場合には、操作回数を 106 10^6 回以下にできることが証明できます。そのような操作列を出力してください。

输入格式

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

N N A0 A_0 A1 A_1 \ldots A2N  1 A_{2^N\ -\ 1}

输出格式

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

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

K K x1 x_1 x2 x_2 \ldots xK x_K

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

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

と定めてください。

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

题目大意

给定正整数 NN,以及一个长度为 2N2^N 的序列,A=A0,A1,,A2N1A=A_0,A_1,\cdots,A_{2^N-1}。满足每个数都是 [0,2N1][0,2^N-1] 里的整数,且互不相同

每次你可以对序列进行两种操作:

  • 操作一:每个数加一,再对 2N2^N 取模。

  • 操作二:选取一个 [0,2N1][0,2^N-1] 中的整数 xx每个数异或上 xx

最终要使得 i,Ai=i\forall i,A_i=i。输出方案或报告无解。

可以证明,若有解,一定能在 10610^6 次操作内实现。可以给出任意合法方案,但你给出的方案不应超过 10610^6 次操作。

若有解,输出中有一行整数依次描述你的每次操作:输出 1-1 表示该次你选择操作一;输出 [0,2N1][0,2^N-1] 中的一个整数 xx 表示你选择用它进行操作二。

3
5 0 3 6 1 4 7 2
Yes
4
-1 6 -1 1
3
2 5 4 3 6 1 0 7
No
3
0 1 2 3 4 5 6 7
Yes
0

提示

制約

  • 1 N 18 1\leq\ N\leq\ 18
  • 0 Ai  2N  1 0\leq\ A_i\ \leq\ 2^N\ -\ 1
  • i j i\neq\ j ならば Ai Aj A_i\neq\ A_j

Sample Explanation 1

出力の操作列によって、数列 A A は次のように変化します。 - 初期状態: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 = 6 x\ =\ 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 = 1 x\ =\ 1 ):A = (0,1,2,3,4,5,6,7) A\ =\ (0,1,2,3,4,5,6,7)

Sample Explanation 2

どのように操作を行っても、目的を達成することはできません。

Sample Explanation 3

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