この問題はインタラクティブ問題です。各行を出力した後、出力バッファをフラッシュする必要があります。C++ では cout << flush、Java では System.out.flush()、Python では sys.stdout.flush() を使用できます。「入出力形式」セクションの指示に厳密に従ってください。そうしない場合、不正解(Wrong Answer)や実行時間制限超過(Time Limit Exceeded)などの判定を受ける可能性があります。
すべての問題が神話のドワーフを主人公にしているため、そろそろ何か具体的なものについて考えてみる価値があるかもしれません。
範囲 $[0, 2^N - 1]$ の整数からなる長さ $N$ の隠された数列 $A$ があります。あなたの課題は、限られた回数のクエリを使ってそれを復元することです。各クエリでは、範囲 $[0, 2^N - 1]$ の要素を持つ長さ $N$ の数列 $B$ を指定します。返答は次のように計算されます。
- 数列 $C$ が作成され、$C$ の $i$ 番目の要素は $A$ と $B$ の $i$ 番目の要素のビットごとの排他的論理和(bitwise xor)になります。排他的論理和を $\oplus$ で表します。
- 集合 $S$ は、$C$ の要素のいくつかの部分集合の排他的論理和をとることで得られるすべての値の集合として構築されます。特に、空集合に対する排他的論理和は $0$ です。
- クエリに対する答えは $|S|$ です。
例えば、$A = (1, 4, 3)$ かつ $B = (0, 4, 7)$ の場合、$C = (1 \oplus 0, 4 \oplus 4, 3 \oplus 7) = (1, 0, 4)$ であり、$S = \{0, 1, 4, 5\}$ となるため、答えは $4$ です。
$2$ つの数 $x$ と $y$ のビットごとの排他的論理和は、$x$ と $y$ のうちちょうど一方のビット $i$ が立っている場合に限り、ビット $i$ が立ちます。例えば、$5 \oplus 3 = (101)_2 \oplus (011)_2 = (110)_2 = 6$ です。C++ および Python では、排他的論理和は演算子 ^ です。
入出力形式
数列 $A$ は最初に固定されており、行われたクエリには依存しません。
まず、$1$ つの整数 $1 \le N \le 60$ を含む行を $1$ 行読み込みます。その後、クエリを送ることができます。
クエリを送るには、? に続けて範囲 $[0, 2^N - 1]$ の $N$ 個の整数を含む行を出力します。その返答として、答えとなる整数を $1$ つ読み込みます。
準備ができたら、! に続けて隠された数列の $N$ 個の整数を出力します。その後、プログラムはそれ以上の出力を行わずに終了しなければなりません。
各クエリの後、および答えを出力した後は、必ず出力をフラッシュしてください。数値と ?、! 記号の間には空白を入れてください。
入出力例
入力例 1
3 4 8
出力例 1
? 1 2 3 ? 0 0 0 ! 1 3 4
注記
サンプルのやり取りの説明:
$N = 3$
クエリ ? 1 2 3:$B = (1, 2, 3)$、$C = (1 \oplus 1, 3 \oplus 2, 4 \oplus 3) = (0, 1, 7)$、$S = \{0, 1, 6, 7\}$、答えは $4$ です。
クエリ ? 0 0 0:$B = (0, 0, 0)$、$C = (1 \oplus 0, 3 \oplus 0, 4 \oplus 0) = (1, 3, 4)$、$S = \{0, 1, \dots, 7\}$、答えは $8$ です。
出力 ! 1 3 4:隠された数列は $A = (1, 3, 4)$ です。
ローカルテスト
Files セクションには、サンプルテストとグレーダー grader.cpp を含む B.zip があります。解答をテストするには、コンパイルしてから、テスト名と実行可能ファイルをコンパイル済みの ./grader に渡してください。
./grader [test] [executable]
例:./grader 0b.in ./abc
サンプルグレーダーは公式のものと完全に同じように動作するとは限りません。ただし、どちらも適応型(adaptive)ではありません。