题目描述
正整数 N および、2N 項からなる数列 A = (A0, A1, …, A2N−1) が与えられます。ここで各 Ai は 0 以上 2N−1 以下の整数であり、i= j ならば Ai= Aj が成り立ちます。
あなたは数列 A に対して、次の 2 種類の操作を行うことができます:
- 操作 +:すべての i に対して、Ai を (Ai + 1) mod 2N に変更する。
- 操作 ⊕:0 以上 2N−1 以下の整数 x を選ぶ。すべての i に対して Ai を Ai⊕ x に変更する。
ただしここで、⊕ はビット単位 XOR 演算を表します。
ビット単位 XOR 演算とは 非負整数 A, B のビット単位 XOR 、A ⊕ B は、以下のように定義されます。
- A ⊕ B を二進表記した際の 2k (k ≥ 0) の位の数は、A, B を二進表記した際の 2k の位の数のうち一方のみが 1 であれば 1、そうでなければ 0 である。
例えば、3 ⊕ 5 = 6 となります (二進表記すると: 011 ⊕ 101 = 110)。
あなたの目的は、すべての i に対して Ai = i が成り立つようにすることです。目的を達成することが可能であるかを判定してください。本問題の制約下では、目的を達成することが可能な場合には、操作回数を 106 回以下にできることが証明できます。そのような操作列を出力してください。
输入格式
入力は以下の形式で標準入力から与えられます。
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
と定めてください。
答が複数考えられる場合には、そのどれを出力しても正解となります。
题目大意
给定正整数 N,以及一个长度为 2N 的序列,A=A0,A1,⋯,A2N−1。满足每个数都是 [0,2N−1] 里的整数,且互不相同。
每次你可以对序列进行两种操作:
最终要使得 ∀i,Ai=i。输出方案或报告无解。
可以证明,若有解,一定能在 106 次操作内实现。可以给出任意合法方案,但你给出的方案不应超过 106 次操作。
若有解,输出中有一行整数依次描述你的每次操作:输出 −1 表示该次你选择操作一;输出 [0,2N−1] 中的一个整数 x 表示你选择用它进行操作二。
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
- 0≤ Ai ≤ 2N − 1
- i= j ならば Ai= Aj
Sample Explanation 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)
Sample Explanation 2
どのように操作を行っても、目的を達成することはできません。
Sample Explanation 3
0 回の操作により目的が達成できます。なお、空行の出力の有無は、ジャッジ結果に影響しません。