Олимпиадный тренинг

Задача . B. Lost Numbers


Это интерактивная задача. Не забывайте о том, что ваша программа должна каждый раз после вывода запроса сбрасывать буфер вывода. Для сброса буфера вывода можно использовать fflush(stdout) в C++, system.out.flush() в Java, stdout.flush() в Python или flush(output) в Pascal. Если вы используете другой язык программирования, посмотрите в его документации, как выполняется эта операция. Также рекомендуем вам прочесть руководство по интерактивным задачам: https://cf.m27.workers.dev/blog/entry/45307.

Жюри загадало некоторый массив \(a\), состоящий из \(6\) чисел. Существуют \(6\) особых чисел — \(4\), \(8\), \(15\), \(16\), \(23\), \(42\) — и каждое из них встречается в массиве \(a\) ровно один раз (то есть \(a\) — некоторая перестановка этих чисел).

Вы не знаете ничего о их порядке в массиве, но вы можете отправить до \(4\) запросов. В каждом запросе вы выбираете два индекса \(i\) и \(j\) (\(1 \le i, j \le 6\), \(i\) и \(j\) не обязательно должны быть различны), и в ответ вы получите значение \(a_i \cdot a_j\).

Можете ли вы отгадать массив \(a\)?

Массив \(a\) в каждом тесте фиксирован заранее, тестирующая программа не пытается адаптировать его в зависимости от ваших запросов.

Протокол взаимодействия

До того, как ваша программа даст ответ на задачу, она может отправить до \(4\) запросов. Чтобы задать запрос, выведите одну строку следующего вида: \(?\) \(i\) \(j\), где \(i\) и \(j\) должны быть двумя целыми числами, удовлетворяющими условию \(1 \le i, j \le 6\). Строка, которую вы отправляете, должна заканчиваться символом перевода строки. После отправки запроса программа должна сбросить буфер вывода и прочитать ответ на запрос — строку, содержащую одно целое число \(a_i \cdot a_j\). Если вы отправите некорректный запрос (или отправите более \(4\) запросов), ответом будет строка 0. Если ваша программа получила такой ответ, она должна немедленно завершиться — иначе вы можете получить вердикт «Ошибка исполнения», «Превышено ограничение времени» или какой-нибудь другой, а не «Неправильный ответ».

Чтобы дать ответ на задачу, ваша программа должна отправить строку \(!\) \(a_1\) \(a_2\) \(a_3\) \(a_4\) \(a_5\) \(a_6\) с символом перевода строки в конце. После этого она должна сбросить буфер вывода и завершиться.

Примечание

Если вы хотите отправить взлом по этой задаче, ваш тест должен содержать ровно шесть целых чисел \(a_1\), \(a_2\), ..., \(a_6\), разделенных пробелами. Каждое из \(6\) особых чисел должно встречаться в тесте ровно один раз. Тест должен заканчиваться символом конца строки.


Примеры
Входные данныеВыходные данные
1 16
64
345
672
? 1 1
? 2 2
? 3 5
? 4 6
! 4 8 15 16 23 42

time 1000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
Комментарий учителя