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

Задача . E. Слишком средне...


Это интерактивная задача.

Мы загадали перестановку \(p_1, p_2, \dots, p_n\) чисел от \(1\) до \(n\), где \(n\) четное. Вы можете угадать ее с помощью следующих запросов:

\(?\) \(k\) \(a_1\) \(a_2\) \(\dots\) \(a_k\).

В ответ, вы узнаете, правда ли, что среднее арифметическое элементов с индексами \(a_1, a_2, \dots, a_k\) является целым числом. Другими словами, вы получите \(1\) если \(\frac{p_{a_1} + p_{a_2} + \dots + p_{a_k}}{k}\) является целым, и \(0\) в противном случае.

Вы должны угадать перестановку. Вы можете задать не более \(18n\) запросов.

Заметим, что перестановки \([p_1, p_2, \dots, p_k]\) и \([n + 1 - p_1, n + 1 - p_2, \dots, n + 1 - p_k]\) неразличимы. Поэтому, гарантируется, что \(p_1 \le \frac{n}{2}\).

Отметим, что \(p\) зафиксирована и не зависит от ваших запросов. Другими словами, интерактор не адаптивен.

Также вы не должны минимизировать количество запросов.

Входные данные

Первая строка содержит единственное целое число \(n\) (\(2 \le n \le 800\), \(n\) четное).

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

Вы начинаете взаимодействие, считав \(n\).

Чтобы задать вопрос об элементах на позициях \(a_1, a_2, \dots, a_k\), в отдельной строке выведите

\(?\) \(k\) \(a_1\) \(a_2\) ... \(a_k\)

Числа в запросе должны удовлетворять условию \(1 \le a_i \le n\), и все \(a_i\) должны быть различными. Не забудьте сделать операцию 'flush', чтобы получить ответ.

В ответ, вы получите \(1\) если \(\frac{p_{a_1} + p_{a_2} + \dots + p_{a_k}}{k}\) является целым, и \(0\) в противном случае.

В случае, если ваш запрос не соответствует требованиям, или вы задали более \(18n\) запросов, программа выведет \(-1\) и прекратит взаимодействие. Вы получите вердикт Неправильный ответ. Вам нужно завершить работу вашей программы, чтобы не получить другие вердикты.

Когда вы определили перестановку, выведите

\(!\) \(p_1\) \(p_2\) ... \(p_n\)

После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • смотрите документацию для других языков.

Формат взломов

Для взломов используйте следующий формат:

Первая строка должна содержать единственное целое число \(n\) (\(2 \le n \le 800\), \(n\) четное).

В следующей строке выведите \(n\) целых чисел \(p_1, p_2, \dots, p_n\) — перестановку чисел от \(1\) до \(n\). \(p_1 \le \frac{n}{2}\) должно выполняться.


Примеры
Входные данныеВыходные данные
1 2
1 2
? 1 2
? 1 1
! 1 2

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

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