Đây là bài toán tương tác. Sau khi in mỗi dòng, bạn cần xóa bộ đệm đầu ra (flush). Bạn có thể dùng cout << flush trong C++, System.out.flush() trong Java, và sys.stdout.flush() trong Python. Bạn phải tuân thủ nghiêm ngặt các hướng dẫn trong phần Tương tác; nếu không bạn có thể nhận các kết quả như sai (Wrong Answer), quá thời gian (Time Limit Exceeded) hoặc các lỗi khác.
Vì tất cả các bài toán đều lấy những chú lùn thần thoại làm nhân vật chính, có lẽ cuối cùng cũng đáng để suy nghĩ về một thứ gì đó cụ thể hơn.
Có một dãy ẩn $A$ độ dài $N$ gồm các số nguyên trong đoạn $[0, 2^N - 1]$. Nhiệm vụ của bạn là khôi phục nó bằng một số lượng truy vấn giới hạn. Trong mỗi truy vấn, bạn cung cấp một dãy $B$ độ dài $N$ với các phần tử trong đoạn $[0, 2^N - 1]$. Phản hồi được tính như sau:
- Dãy $C$ được tạo ra trong đó phần tử thứ $i$ của $C$ là phép xor bit (bitwise xor) của phần tử thứ $i$ của $A$ và $B$. Ta ký hiệu phép xor là $\oplus$.
- Tập hợp $S$ được xây dựng là tập hợp tất cả các giá trị có thể thu được bằng cách xor một tập con các phần tử nào đó của $C$. Cụ thể, đối với tập con rỗng, tổng xor là $0$.
- Câu trả lời cho truy vấn là $|S|$.
Ví dụ, nếu $A = (1, 4, 3)$ và $B = (0, 4, 7)$, thì $C = (1 \oplus 0, 4 \oplus 4, 3 \oplus 7) = (1, 0, 4)$ và $S = \{0, 1, 4, 5\}$, vì vậy câu trả lời là $4$.
Phép xor bit của hai số $x$ và $y$ có bit thứ $i$ được bật khi và chỉ khi đúng một trong hai số $x$ và $y$ có bit thứ $i$ được bật. Ví dụ, $5 \oplus 3 = (101)_2 \oplus (011)_2 = (110)_2 = 6$. Trong C++ và Python, phép xor là toán tử ^.
Tương tác
Dãy $A$ được cố định ngay từ đầu và không phụ thuộc vào các truy vấn được thực hiện.
Đầu tiên, đọc một dòng chứa một số nguyên $1 \le N \le 60$. Sau đó bạn có thể đặt các truy vấn.
Để hỏi một truy vấn, hãy in một dòng chứa ? theo sau là $N$ số nguyên trong đoạn $[0, 2^N - 1]$. Đáp lại, hãy đọc một số nguyên là câu trả lời.
Khi đã sẵn sàng, hãy in ! theo sau là $N$ số nguyên của dãy ẩn. Sau đó chương trình của bạn phải thoát mà không in thêm bất kỳ đầu ra nào.
Hãy nhớ flush sau mỗi truy vấn và sau khi in câu trả lời. Đặt dấu cách giữa các số và các ký hiệu ?, !.
Ví dụ
Dữ liệu vào 1
3 4 8
Kết quả 1
? 1 2 3 ? 0 0 0 ! 1 3 4
Giải thích
Giải thích cho tương tác ví dụ:
$N = 3$
Truy vấn ? 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\}$, câu trả lời là $4$.
Truy vấn ? 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\}$, câu trả lời là $8$.
Đầu ra ! 1 3 4: Dãy ẩn là $A = (1, 3, 4)$.
Kiểm thử cục bộ
Trong phần Files, bạn có thể tìm thấy tệp B.zip chứa các test ví dụ và trình chấm grader.cpp. Để kiểm thử lời giải của bạn, hãy biên dịch nó, sau đó truyền tên test và tệp thực thi của bạn vào ./grader đã biên dịch:
./grader [test] [executable]
Ví dụ: ./grader 0b.in ./abc
Trình chấm ví dụ không được đảm bảo hoạt động giống hệt với trình chấm chính thức. Tuy nhiên, cả hai đều không thích ứng (non-adaptive).