Технокубок 2021 - Финал |
---|
Закончено |
Густав — старший менеджер большого банка. У него есть неограниченный доступ в базу данных банка, и в несколько кликов он может переместить любую сумму со счета банковского резерва на свой личный счет. Однако банк недавно внедрил популярную систему, использующую искусственный интеллект, для отслеживания мошеннических операций, что затрудняет кражу.
Густав знает, что данная система просто отслеживает все операции, превышающие сумму в $$$M$$$ евро, и такие операции проверяются вручную некоторым количеством банковских работников. Поэтому любая мошенническая операция, превышающая данный лимит, будет обнаружена, а любая меньшая операция останется незамеченной.
Густав не знает значение лимита $$$M$$$ и хочет его найти. За одну операцию он может выбрать некоторое целое число $$$X$$$ и попробовать переместить $$$X$$$ евро из банковского резерва на личный счет. Затем случается следующее.
Изначально на счету Густава $$$1$$$ евро. Помогите ему найти точное значение $$$M$$$ за не более чем $$$105$$$ операций, не допуская увольнения.
Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число $$$t$$$ ($$$1 \le t \le 1000$$$) — количество наборов входных данных.
В каждом наборе входных данных нет никаких входных данных до вашего первого запроса. Гарантируется, что $$$M$$$ — целое число, и $$$0 \le M \le 10^{14}$$$.
В каждом наборе входных данных, когда вы знаете значение $$$M$$$, выведите одну строку формата «! $$$M$$$». После этого ваша программа должна перейти к следующему набору входных данных или завершиться, если это был последний набор.
Когда вы хотите сделать операцию, выведите строку формата «? $$$X$$$», означающую, что вы пробуете переместить $$$X$$$ евро ($$$1 \le X \le 10^{14}$$$). К качестве ответа считайте одну строку, которая может принимать следующие значения:
Вы можете сделать не более чем $$$105$$$ запросов такого типа в каждом наборе входных данных.
После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:
Взломы
Чтобы сделать взлом, подготовьте входные данные в следующем формате.
Первая строка содержит одно целое число $$$t$$$ ($$$1 \le t \le 1000$$$) — количество наборов входных данных.
Каждый набор входных данных описывается строкой, содержащей одно целое число $$$M$$$ ($$$0 \le M \le 10^{14}$$$).
1 Lucky! Lucky! Lucky! Lucky! Lucky! Fraudster!
? 1 ? 2 ? 3 ? 4 ? 5 ? 6 ! 5
В примере $$$M = 5$$$, поэтому операция $$$X = 6$$$ будет обнаружена. В этот момент баланс счета Густава составляет $$$16$$$ евро, поэтому он просто платит штраф.
Название |
---|