Это интерактивная задача. После вывода каждой строки необходимо сбрасывать буфер вывода (flush). Вы можете использовать cout << flush в C++, System.out.flush() в Java и sys.stdout.flush() в Python. Вы должны строго следовать инструкциям в разделе «Протокол взаимодействия», иначе вы можете получить вердикт «неправильный ответ» (wrong answer), «превышено ограничение по времени» (time limit exceeded) или другой.
Поскольку во всех задачах главными героями являются мифические гномы, возможно, наконец-то стоит подумать о чем-то осязаемом.
Загадана скрытая последовательность $A$ длины $N$, состоящая из целых чисел в диапазоне $[0, 2^N - 1]$. Ваша задача — восстановить ее за ограниченное число запросов. В каждом запросе вы предоставляете последовательность $B$ длины $N$ с элементами в диапазоне $[0, 2^N - 1]$. Ответ вычисляется следующим образом:
- Создается последовательность $C$, где $i$-й элемент $C$ равен побитовому исключающему ИЛИ (bitwise xor) $i$-х элементов $A$ и $B$. Мы обозначаем xor символом $\oplus$.
- Множество $S$ строится как множество всех значений, которые можно получить, взяв xor некоторого подмножества элементов $C$. В частности, для пустого подмножества xor равен $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$.
Побитовое исключающее ИЛИ двух чисел $x$ и $y$ имеет установленный бит $i$ тогда и только тогда, когда ровно у одного из чисел $x$ и $y$ установлен бит $i$. Например, $5 \oplus 3 = (101)_2 \oplus (011)_2 = (110)_2 = 6$. В C++ и Python операция xor обозначается оператором ^.
Протокол взаимодействия
Последовательность $A$ фиксирована изначально и не зависит от сделанных запросов.
Сначала считайте строку, содержащую одно целое число $1 \le N \le 60$. Затем вы можете задавать запросы.
Чтобы задать запрос, выведите строку, содержащую символ ?, за которым следуют $N$ целых чисел в диапазоне $[0, 2^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 вы можете найти архив B.zip, содержащий примеры тестов и грейдер grader.cpp. Чтобы протестировать свое решение, скомпилируйте его, а затем передайте имя теста и ваш исполняемый файл скомпилированному ./grader:
./grader [test] [executable]
Например: ./grader 0b.in ./abc
Не гарантируется, что поведение примера грейдера полностью совпадает с официальным. Однако ни один из них не является адаптивным.