ICPC Central Russia Regional Contest, 2024
A. Пирамидальные пути
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Недавно на паре по дискретной математике студент Саша узнал о пирамидальных гамильтоновых путях. Гамильтоновым путём называют путь в графе, проходящий через каждую вершину ровно один раз. Отличительным свойством пирамидальных гамильтоновых путей является то, что номера вершин в них либо идут сначала в порядке возрастания номеров вершин, а затем в порядке убывания номеров, либо сначала номера идут в порядке убывания номеров вершин, а затем в порядке возрастания номеров, причём промежутки возрастания и убывания должны содержать в себе не менее двух элементов (при этом промежутки возрастания и убыванию могут иметь общий элемент).

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

В первой строке содержится число $$$n$$$ $$$(3 \le n \le 10^5)$$$ – количество вершин в гамильтоновом пути.

Во второй строке содержатся $$$n$$$ попарно различных чисел $$$a_i$$$ $$$(1 \le a_i \le n)$$$ – перечисление вершин пути.

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

В единственной строке выведите «YES» (без кавычек), если указанный гамильтонов путь является пирамидальным, и «NO» в противном случае.

Примеры
Входные данные
5
4 3 1 2 5
Выходные данные
YES
Входные данные
3
1 3 2
Выходные данные
YES
Входные данные
6
4 5 6 1 2 3
Выходные данные
NO
Входные данные
5
1 2 3 4 5
Выходные данные
NO
Примечание

Во втором тестовом примере путь разбивается на 2 промежутка: (1, 3) и (3, 2).

B. Язык для машин
ограничение по времени на тест
0.25 секунд
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Препроцессинг одного из языков, предназначенного для управления оборудованием, состоит из следующих этапов:

  1. Удаление пустых строк. Строка считается пустой, если содержит только пробельные символы.
  2. Склейка строк, имеющих на конце символ переноса строки. Символом переноса является символ доллара $, за которым может следовать любое количество пробельных символов. Склейка осуществляется следующим образом: из потока символов исключаются символы, начиная с доллара, и следующие за ним пробельные символы до конца строки (включая сам перевод строки).
  3. Удаление строк с комментариями. В языке есть только однострочные комментарии. Строки с комментарием начинаются с двойного знака доллара: $$, за которыми следует как минимум один непробельный символ. С начала строки и до двойного доллара $$ допустимы только пробельные символы – наличие перед ним иных символов означает, что это не комментарий.

    Комментарий продолжается до конца строки и не может быть перенесен на следующую с помощью символа переноса. Строка комментария удаляется целиком, включая ведущие пробельные символы (если они есть).

Пробельными символами в языке считаются пробелы (код 32) и табуляции (код 9).

Программа всегда завершается пустой строкой.

Преобразования осуществляются в указанном порядке:

  • Первый пункт применяется ко всему входному потоку – после него в потоке не остается пустых строк.
  • Второй пункт применяется ко всем строкам потока, с учетом того, что начальная строка, участвующая в склейке, не может быть комментарием.
  • Для получившегося потока выполняется третий пункт.

Напишите программу, которая произведет препроцессинг описанного типа.

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

На вход подается программа, состоящая как минимум из одной непустой программной (не комментарий), строки. Программа может содержать только символы ASCII с кодами от 32 до 127, табуляции (код 9), переводы строк в виде комбинации символов с кодами 13 (CR) и 10 (LF) в указанном порядке.

Размер входной программы не превосходит 64КБ.

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

На выход подается программа, содержащая как минимум одну непустую строку, преобразованная по указанным выше правилам.

Примеры
Входные данные
EXAMPLE PROGRAM

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

EXAMPLE $
PROGRAM

Выходные данные
EXAMPLE PROGRAM
Входные данные
$$ COMMENT
EXAMPLE

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

C. Неудачные псевдослучайные
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Хакер Кирилл решил разработать новый генератор случайных чисел. Для этого он взял два больших числа $$$ n $$$ и $$$ m $$$, превратил их в степени двойки, сложил, и полученную сумму возвёл в небольшую степень $$$ k $$$, и получил некоторое число $$$ r = (2^n + 2^m)^k $$$. Случайные числа предполагалось вырезать из двоичной записи числа $$$ r $$$.

Когда Кирилл опубликовал свои идеи на форуме, один из коллег сказал, что полученные числа будут слишком неслучайны, указав, что даже просто количество единичных битов в двоичной записи числа $$$ r $$$ слишком предсказуемо.

Помогите Кириллу проверить утверждение коллеги. Напишите программу, которая по числам $$$ n $$$, $$$ m $$$ и $$$ k $$$ определит количество единичных битов в двоичной записи числа $$$ r = (2^n + 2^m)^k $$$.

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

В единственной строке содержатся 3 целых числа $$$ n (0 \leq n \leq 10^9) $$$, $$$ m (0 \leq m \leq 10^9) $$$ и $$$ k (0 \leq k \leq 100) $$$, разделенные пробелом.

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

В единственной строке выведите число – количество единиц в двоичной записи числа $$$ r = (2^n + 2^m)^k $$$.

Пример
Входные данные
3 1 3
Выходные данные
6

D. Пастбище для слонов
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Для восстановления популяции слонов в одной африканской стране было предложено создать специализированную ферму. Под ферму был выделен участок саванны размером $$$ n \times m $$$ километров. Численность стада слонов такова, что за день оно съедает растительность на 1 кв. километре, после чего его следует перевести на другой участок.

Для оптимизации процесса вся ферма была разбита на квадратные участки со стороной 1 км, огороженные заборами. Было решено, что перевод стада будет осуществляться только 1 раз в день и только на соседний участок, имеющий с нынешним общую сторону.

Установлено, что для поддержания максимально естественного процесса питания слоны должны питаться по $$$ k $$$ дней подряд одной и той же травой. Каждый участок будущего пастбища планируется засеять одним видом травы, и всего будет задействовано $$$ p $$$ их разновидностей.

Чтобы растительность между визитами стада максимально восстанавливалась, было предложено составить циклический маршрут таким образом, чтобы он:

  • был максимально длинным;
  • пересекал только вертикальные или горизонтальные границы участков;
  • не содержал самопересечений;
  • состоял из $$$ p $$$ отрезков, засеваемых одинаковой травой, по $$$ k $$$ участков в каждом.

Напишите программу, которая по заданным числам $$$ n $$$, $$$ m $$$, $$$ k $$$ и $$$ p $$$ построит маршрут стада слонов, либо сообщит что такого решения нет.

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

На вход программе подаются четыре целых числа: $$$ n ~ (1 \leq n \leq 100)$$$, $$$ m ~ (1 \leq m \leq 100)$$$, $$$ k $$$ и $$$ p $$$ $$$( k, p \gt 0,~ 2 \lt k \times p \leq n \times m )$$$, разделенные пробелами.

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

Первая строка вывода должна содержать слово «YES» (без кавычек), если решение существует, и слово «NO» в противном случае. Если решение существует, то далее выведите блок из $$$ n $$$ строк. Блок описывает маршрут движения стада. Каждая строка состоит из $$$ m $$$ различных символов:

  • «.»(точка), если данный участок не посещается;
  • «-»(минус), если маршрут стада пересекает левую и правую границы участка;
  • «|»(вертикальная черта), если маршрут стада пересекает верхнюю и нижнюю границы участка;
  • «L»(заглавная латинская L), если маршрут стада пересекает верхнюю и правую границы участка;
  • «r»(строчная латинская r), если маршрут стада пересекает нижнюю и правую границы участка;
  • «J»(заглаваня латинская J), если маршрут стада пересекает левую и верхнюю границы участка;
  • «7»(цифра 7), если маршрут стада пересекает левую и нижнюю границы участка.

Если решений несколько, выведите любое из них.

Примеры
Входные данные
3 3 2 4
Выходные данные
YES
r-7
|rJ
LJ.
Входные данные
3 3 3 3
Выходные данные
NO

E. Ника и репка
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Нике нравится сказка про репку. Всем известна сказка про репку, где общим трудом её смогли вытащить из земли. Дедка за репку, бабка за дедку, внучка за бабку, жучка за внучку, кошка за жучку, мышка за кошку. Ника заинтригована вопросом: «Неужели мышка такая сильная?»

Вам известны показатели силы каждого из $$$n$$$ помощников. Сила $$$i$$$-го помощника равна $$$a_i$$$. Нике достоверно известно: чтобы вытащить репку, необходимо приложить минимум $$$x$$$ силы. Помощников в ряду можно поменять местами произвольным образом. Когда помощники начнут тянуть репку, их суммарная сила будет равняться $$$\displaystyle\sum_{i=1}^n\dfrac{b_i}{i}$$$, где $$$i$$$ – номер помощника в ряду (первый стоит дальше всех от репки, $$$n$$$-й держится за репку), $$$b_i$$$ – его сила.

Помогите Нике определить, могут ли помощники вытащить репку.

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

В первой строке заданы два целых числа $$$n$$$, $$$x$$$ $$$(1 \leq n \leq 1000, 1 \leq x \leq 10^{12})$$$  — количество помощников и суммарная сила, которую нужно приложить, чтобы вытянуть.

Во второй строке заданы $$$n$$$ целых чисел $$$a_i$$$ $$$(1 \leq a_i \leq 10^{12})$$$  — сила каждого помощника.

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

В единственной строке выведите «YES» (без кавычек), если репку можно вытянуть, иначе «NO».

Примеры
Входные данные
5 8
5 4 3 2 1
Выходные данные
YES
Входные данные
6 20
10 4 2 4 2 8
Выходные данные
NO
Входные данные
6 16
10 4 2 4 2 8
Выходные данные
YES

F. Мобильная связь
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

В некотором отдалённом районе имеется N деревень, где отсутствует сотовая связь. В один прекрасный момент крупный мобильный провайдер выделил средства на строительство в этой местности одной либо двух базовых станций. К постройке каждой станции есть требование: она должна быть построена непосредственно в какой-то деревне. Осталось определить, в каких именно деревнях установить станции, а также выбрать их радиусы покрытия, чтобы жители всех деревень могли использовать мобильные телефоны.

Понятно, что чем больше радиус покрытия станции, тем она дороже и тем больше электричества потребляет. Поэтому провайдер решил выбрать места установки станций и радиусы их действия так, чтобы сумма квадратов радиусов получилась минимальной.

Определите, в каких деревнях установить одну или две станции и какие должны быть их радиусы покрытия R1 и R2, чтобы сумма R12 + R22 получилась минимальной и чтобы при этом каждая деревня оказалась в зоне покрытия хотя бы одной станции. В случае установки одной станции радиус покрытия второй можно считать равным нулю.

Все деревни небольшие, поэтому их можно считать точками. Если какая-то станция обслуживает единственную деревню (в которой она установлена), то её радиус покрытия считайте равным 1.

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

В первой строке входных данных записано целое число N – количество деревень (2 ≤ N ≤ 500). В следующих N строках записаны по два целых числа в диапазоне от 0 до 109 – координаты деревень. Никакие две пары координат не совпадают.

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

Выведите минимальное значение величины R12 + R22, округлённое до ближайшего целого.

Примеры
Входные данные
4
0 1
1 0
4 1
5 3
Выходные данные
7
Входные данные
3
0 0
1 0
2 0
Выходные данные
1
Входные данные
3
0 0
5 0
0 1
Выходные данные
2
Примечание

В первом примере можно разместить первую станцию с радиусом в деревне 1 и вторую станцию с радиусом в деревне 3.

Во втором примере достаточно взять всего одну станцию с радиусом 1 и разместить её в деревне 2 – она будет обслуживать все три деревни.

В третьем примере можно разместить станцию с радиусом 1 в деревне 1 и вторую станцию с радиусом 1 в деревне 2.

G. Задача на дерево
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Помимо бинарных деревьев на парах по дискретной математике Профессор Р. также рассказывает об ориентированных деревьях. Дадим определение направленного дерева. Ориентированное (направленное) дерево — ациклический ориентированный граф, в котором только одна вершина имеет нулевую степень захода (в неё не ведут дуги), а все остальные вершины имеют степень захода 1 (в них ведёт ровно по одной дуге). Вершина с нулевой степенью захода называется корнем дерева, вершины с нулевой степенью исхода (из которых не исходит ни одна дуга) называются концевыми вершинами или листьями. На рисунке ниже показан пример ориентированного дерева.

После занятия по ориентированным деревьям профессор задал студентам на дом следующую задачу.

Покрасим все вершины ориентированного дерева в некоторые цвета (обозначим через $$$c_i$$$ цвет вершины с номером $$$i$$$). После этого для каждой вершины $$$i$$$ профессор хочет узнать, какой цвет встречается чаще всего в поддереве, корнем которого является вершина с данным номером $$$i$$$.

Как ни старались студенты, они не смогли придумать, как решить эту задачу. Помогите им – напишите программу, которая ответит на все запросы, составленные профессором Р.

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

В первой строке содержатся числа $$$N$$$ $$$(1 \le N \le 2 \cdot 10^5)$$$ – количество вершин в дереве.

Во второй строке содержатся $$$N$$$ чисел $$$c_i$$$ $$$(1 \le c_i \le 10^9)$$$, разделенных пробелом, – цвета вершин, $$$i$$$-е число соответствует вершине с номером $$$i$$$.

В следующих $$$N - 1$$$ строке содержатся пары чисел $$$u$$$ и $$$v$$$ $$$(1 \le u, v \le N, u \ne v)$$$, описывающие рёбра дерева. Вершина $$$u$$$ соответствует началу ребра, $$$v$$$ – его концу. Гарантируется, что граф во входных данных является ориентированным деревом. Не гарантируется, что вершина $$$1$$$ является корнем дерева.

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

Выведите $$$N$$$ чисел, разделенных пробелом, $$$i$$$-е число в выводе должно соответствовать цвету, который чаще всего встречается в поддереве, корнем которого является вершина $$$i$$$. Если требуемых цветов несколько, требуется вывести цвет с наименьшим значением.

Примеры
Входные данные
8
1 2 3 4 5 6 7 8
1 3
1 5
1 6
6 2
6 7
6 8
3 4
Выходные данные
1 2 3 4 5 2 7 8
Входные данные
8
1 2 1 1 1 2 2 2
1 3
1 5
1 6
6 2
6 7
6 8
3 4
Выходные данные
1 2 1 1 1 2 2 2
Примечание

Деревья во входных данных соответствуют картинке из условия.

H. Рейтинг вузов
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Профессор Р. помимо преподавания в университете принимает участие в соревнованиях по программированию как составитель задач. Сегодня профессора Р. посетила светлая мысль – он решил создать рейтинг-лист вузов, участвовавших в четвертьфинальных соревнованиях по спортивному программированию, проводимых в городе Киберславль. Для подсчёта рейтинга профессор придумал формулу:

$$$R = 4 \cdot R_0 + 3 \cdot R_1 + 2 \cdot R_2$$$,

где $$$R$$$ – общий рейтинг, $$$R_0$$$ – рейтинг последнего года, $$$R_1$$$ – рейтинг предыдущего года, $$$R_2$$$ – рейтинг года двухлетней давности. Рейтинг вуза по итогам года считается по формуле:

$$$R_y = 10 \cdot k + 2 \cdot a + b + c$$$,

где $$$R_y$$$ – рейтинг вуза за год, $$$k$$$ – число задач, решённых сильнейшей (сильнейшей считается команда, решившая больше всех задач, при равенстве задач сильнейшей считается команда, занявшая более высокое место) командой вуза в четвертьфинале, $$$a, b, c$$$ – премиальные очки за занятые места, полученные первой, второй и третьей командами вуза в четвертьфинале (если второй и третьей команды не было, они вносят в рейтинг 0 баллов).

Премиальные очки за места в четвертьфинале начисляются следующим образом: 50-е место приносит команде 1 балл, 49-е – 2 балла и т. д. с шагом 1 до 11 места включительно, которое таким образом «стоит» 40 баллов. Далее, 10 место приносит 42 балла, 9-е – 44, 8-е – 46, 7-е – 48, 6-е – 50, 5-е – 53, 4-е – 57, 3-е – 62, 2-е – 68 и, наконец, 1-е – 80 баллов.

Перед тем, как применить эту формулу для всех вузов, профессор Р. решил посчитать рейтинг для Киберславского государственного университета, однако это оказалось не так просто – каждый год от университета выступает множество команд, а искать их в таблице профессор не хочет, поэтому просит вас помочь ему и написать программу, которая по результатам трёх последних четвертьфиналов поможет рассчитать рейтинг вуза.

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

В первой строке содержится число $$$N_0$$$ $$$(1 \le N_0 \le 20)$$$ – количество команд Киберславского государственного университета, участвовавших в четвертьфинале текущего года.

Далее следуют $$$N_0$$$ строк, описывающих результаты команд в четвертьфинале текущего года. Результат каждой команды задаётся в формате $$$name~problems~place$$$, где $$$name$$$ – название команды (строка длины не более 50, состоящая из цифр, больших и маленьких латинских букв, а также символов нижнего подчёркивания), $$$ploblems$$$ $$$(0 \le problems \le 15)$$$ – количество решенных командой задач, $$$place$$$ $$$(1 \le place \le 100)$$$ – занятое командой место.

В следующей строке содержится число $$$N_1$$$ $$$(1 \le N_1 \le 20)$$$ – количество команд Киберславского государственного университета, участвовавших в четвертьфинале предыдущего года.

Далее следуют $$$N_1$$$ строк в формате, аналогичном результатам текущего года.

В следующей строке содержится число $$$N_2$$$ $$$(1 \le N_2 \le 20)$$$ – количество команд Киберславского государственного университета, участвовавших в четвертьфинале двухлетней давности.

Далее следуют $$$N_2$$$ строк в формате, аналогичном результатам текущего года.

Гарантируется, что все данные корректны и команды, занявшие более высокие места, решили задач не меньше, чем команды, занявшие более низкие места, а также нет команд, занявших одно и то же место.

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

В единственной строке выведите число – рейтинг Киберславского государственного университета.

Примеры
Входные данные
7
O0 10 1
mmm 7 7
MAD_DOS 4 20
OsuzhdayCPlusPlus 4 18
zero_divisor 4 23
Lemon 5 12
3pixels 5 13
6
STACKMANS 6 11
xiaococka 6 7
MMM 8 1
Lemon 6 12
AmateraSU 6 8
Four_dimensional_cat 4 19
9
Yess_we_can 13 1
chill_owls 9 5
STACKmans 5 17
MPM 5 18
Cherniy_zhisny_vazhno 4 23
Four_dimensional_cat 6 14
HuRMa 7 9
Dead_Inside_Team 7 11
LigaDravena 9 4
Выходные данные
3190
Входные данные
1
Adyghe_SU_1 3 73
2
Adyghe_SU_1 6 36
Adyghe_SU_2 3 65
1
Adyghe_SU_1 5 19
Выходные данные
618
Примечание

Рассмотрим второй пример.

В четвертьфинале текущего года приняла участие одна команда, она решила 3 задачи и не получила бонусных баллов, отсюда $$$R_0 = 30$$$. В четвертьфинале прошлого года лучшая команда решила 6 задач и заняла 36 место, получив 15 бонусных баллов, отсюда $$$R_1 = 60 + 2 \cdot 15 = 90$$$. В четвертьфинале позапрошлого года участвовала одна команда, которая решила 5 задач и получила 32 бонусных балла, отсюда $$$R_2 = 50 + 2 \cdot 32 = 114$$$. Итого $$$R = 4 \cdot R_0 + 3 \cdot R_1 + 2 \cdot R_2 = 4 \cdot 30 + 3 \cdot 90 + 2 \cdot 114 = 618$$$.

I. Ника и золотая рыбка
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Нике нравится сказка про золотую рыбку. Ника решила, что может сама нарисовать золотую рыбку. Каждую часть золотой рыбки Ника нарисовала в виде многоугольников без самопересечений. Хвост золотой рыбки соединен с туловищем в единственной вершине, а голова соединена с туловищем по одному общему отрезку.

Ника смогла пронумеровать все вершины, их получилось $$$n$$$ штук, но вот посчитать размер каждой части золотой рыбки оказалось для неё затруднительной задаче. Помогите Нике посчитать, из какого количества отрезков состоят голова, туловище и хвост у золотой рыбки.

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

В первой строке задано целое число $$$n$$$ $$$(6\leq n \leq 10^5)$$$  — количество вершин в рыбке.

Далее заданы $$$n+2$$$ строки, в которых заданы пары целых чисел $$$a_i$$$, $$$b_i$$$ $$$(1 \leq a_i,~b_i \leq n)$$$, разделённые пробелом — номера вершин, соединенных отрезком.

Гарантируется, что голова, туловище и хвост состоят минимум из трех отрезков.

Гарантируется, что голова и хвост не имеют общих вершин.

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

В единственной строке через пробел выведите три целых числа – количество отрезков в голове, туловище и хвосте золотой рыбки соответственно.

Пример
Входные данные
11
1 2
1 4
2 3
4 3
9 10
11 10
11 9
5 7
7 9
4 6
6 8
8 10
4 5
Выходные данные
3 7 4
Примечание

Золотая рыбка из примера выглядит следующим образом:

J. Морской бой
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Пете и Васе наскучило играть в камешки, и они решили изобрести собственную игру. За основу был взят морской бой и усовершенствован.

Новая игра ведется на клетчатом поле размером $$$ 1 \times n $$$. Клетки поля пронумерованы числами от 1 до $$$ n $$$ слева направо.

Петя прячет на поле единственный корабль длиной $$$ k $$$ палуб.

Вася пытается найти корабль, загадывая числа $$$ t $$$ и сообщая их Пете. В ответ на сообщенное число $$$ t $$$ Петя вычисляет число $$$ r $$$ – сколько раз бы произошло попадание в корабль, если бы стреляли по клеткам $$$ t, 2t, 3t, ..., r \times t, ... $$$. Результаты попыток записываются в протокол. Вася может сделать $$$ c $$$ попыток и выигрывает, если точно определяет положение корабля Пети.

Напишите программу, которая по протоколу игры найдет позицию корабля, если такая позиция существует.

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

Первая строка содержит три целых числа $$$ n $$$, $$$ k $$$ ($$$ 1 \lt n \leq 1000, 0 \lt k \lt n $$$) и $$$ c $$$ ($$$ 0 \leq c \leq 100 $$$). Далее следуют $$$ c $$$ строк, содержащих пары чисел $$$ t_i $$$ (шаг $$$i$$$-й попытки, $$$ 0 \lt t_i \lt n $$$) и $$$ r_i $$$ (результат $$$i$$$-й попытки, $$$0\leq r_i \leq k$$$).

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

В единственной строке выведите число – позицию корабля, заданную номером его самой левой клетки. Если позиции не существует, выведите -1. Если допустимых позиций несколько, то выведите самую левую из них.

Примеры
Входные данные
16 5 3
2 3
3 1
5 1
Выходные данные
4
Входные данные
16 5 3
2 3
3 1
15 1
Выходные данные
-1
Входные данные
16 5 3
2 3
3 1
14 1
Выходные данные
10

K. Числовая последовательность Грея
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Читая старый учебник по алгебре, профессор Р. наткнулся на интересные числовые последовательности, называемые последовательностями Грея. Первая последовательность Грея состоит из числа $$$1$$$, вторая последовательность Грея состоит из чисел $$$1, 2, 1$$$, третья последовательность Грея равна $$$1, 2, 1, 3, 1, 2, 1$$$ и т. д., последовательность Грея с номером $$$i$$$ состоит из $$$(i - 1)$$$-й последовательности Грея, числа $$$i$$$ и вновь записанной $$$(i - 1)$$$-й последовательности Грея. Профессор обозначил через $$$f(n)$$$ сумму чисел в $$$n$$$-й последовательности Грея и просит вас написать программу, которая найдёт правильный ответ для заданного $$$n$$$. Так как эта сумма может оказаться очень большой, он просит посчитать остаток от деления суммы на число $$$10^9 + 9$$$.

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

В единственной строке содержится число $$$n$$$ $$$(1 \le n \le 10^{18})$$$ – номер последовательности Грея.

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

В единственной строке выведите число – остаток от деления $$$f(n)$$$ на $$$10^9 + 9$$$.

Примеры
Входные данные
1
Выходные данные
1
Входные данные
2
Выходные данные
4
Входные данные
1000
Выходные данные
829390959

L. Таблетки
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

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

Брат профессора Р. доктор Р. является фармацевтом и работает в одной из аптек Киберславля. Сегодня ему в аптеку пришла партия из $$$N$$$ баночек с таблетками лекарства для укрепления памяти, в каждой баночке $$$N$$$ таблеток. Однако случилась беда: выяснилось, что все таблетки в одной из баночек оказались поддельными. Известно, что каждая таблетка с настоящим лекарством весит $$$500$$$ миллиграмм, а каждая поддельная таблетка весит $$$501$$$ миллиграмм. У доктора Р. есть точные весы, которые показывают суммарный вес таблеток, которые на них положили. Доктор Р. хочет за одно взвешивание узнать, в какой баночке лежат фальшивые таблетки. Чтобы это было удобнее сделать, он пронумеровал баночки числами от $$$1$$$ до $$$N$$$, однако так и не придумал, как правильно сделать одно взвешивание. Доктор попытался обратиться с этим вопросом к брату, однако тот уехал на научную конференцию и оказался недоступен. Поэтому доктор Р. просит вас помочь ему определить баночку с фальшивыми таблетками.

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

Сначала на вход вашей программе подаётся число $$$N$$$ $$$(1 \le N \le 10^5)$$$ – количество баночек с таблетками.

После этого ваша программа может делать запрос:

  1. В первой строке нужно вывести $$$K$$$ $$$(1 \le K \le N)$$$ – количество открываемых баночек.
  2. В следующих $$$K$$$ строках нужно вывести в выходной поток пары чисел $$$x~y$$$ $$$(1 \le x \le N, 1 \le y \le N)$$$, где $$$x$$$ – номер баночки, $$$y$$$ – количество таблеток, которые кладутся на весы. Никакая баночка не должна быть указана дважды.

В качестве ответа на запрос нужно будет считать число – суммарный вес таблеток в миллиграммах, который показали весы.

После сделанного запроса вам нужно будет определить номер баночки с фальшивыми таблетками. Для этого нужно будет вывести в выходной поток в отдельной строке «$$$!~M$$$», где $$$M$$$ – номер баночки, в которой, по вашему мнению, находятся фальшивые таблетки.

Если ваша программа сделает более 1 запроса или задаст некорректный запрос (например, запросит номер баночки или количество таблеток большее $$$N$$$), она получит любой вердикт, отличный от «Accepted».

После каждого действия вашей программы выводите символ перевода строки. После вывода очередной строки обязательно используйте функции очистки потока, чтобы часть вашего вывода не осталась в каком-нибудь буфере. Например, на С++ надо использовать функцию «fflush(stdout)», в Pascal «flush(output)» на Java и Kotlin вызов «System.out.flush()» и «stdout.flush()» для языка Python.

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

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

! 1

M. Игра с магнитами
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Три колеса 1, 2 и 3 с длинами обода $$$ k $$$, $$$ l $$$ и $$$ m $$$ сантиметров свободно вращаются на осях. Оси колес закреплены на прямой балке слева направо так, что колесо 1 соприкасается с колесом 2, а колесо 2 соприкасается с колесом 3. Если вращать колесо 1, то оно передаст вращение на колесо 2, а то, в свою очередь, на колесо 3.

Через каждый сантиметр рядом с ободами колес закреплены магниты разной силы. Для простоты силу магнитов обозначим целыми числами от 1 (самый слабый магнит) до $$$ max(k, l, m) $$$ (самый сильный). Магниты первого колеса имеют силу от $$$ 1, 2, 3, ..., k $$$, второго – $$$ 1, 2, 3, ..., l $$$, третьего – $$$ 1, 2, 3, ..., m $$$. На каждом колесе магниты расположены строго по возрастанию и против направления часовой стрелки (за исключением самого сильного и слабого магнитов, стоящих рядом).

Изначально колеса расположены так, что самые слабые магниты (с силой 1) находятся в крайнем левом положении. Рядом с крайней правой точкой колеса 3 закреплен магнит с силой 200 (сильнее, чем любой магнит на колесах).

Первое колесо начинает вращаться со скоростью обода 1 см в секунду по часовой стрелке. Соответственно, второе колесо вращается с такой же скоростью, но уже против часовой стрелки. Третье колесо, с такой же скоростью, снова вращается по часовой стрелке. На магните 1 первого колеса закреплен железный шарик. В процессе вращения колес шарик может переходить со слабого магнита на более сильный, но только в точках касания колес либо с крайней правой позиции колеса 3 на магнит с силой 200.

Напишите программу, которая по заданным числам $$$ k $$$, $$$ l $$$ и $$$ m $$$, определит, окажется ли когда-нибудь шарик на магните 200, и если окажется, то через сколько секунд после начала вращения колес.

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

На вход подаются три целых числа $$$ k $$$, $$$ l $$$ и $$$ m $$$ ($$$ 4 \leq k,l,m \leq 100 $$$, все $$$k, l, m $$$ – четные), разделенные пробелами.

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

Выведите количество секунд от начала вращения до момента, когда шарик окажется на магните 200, либо -1, если он никогда на нем не окажется.

Примеры
Входные данные
4 6 8
Выходные данные
9
Входные данные
4 8 4
Выходные данные
-1
Входные данные
4 4 4
Выходные данные
-1
Примечание
Пример для колес, размера 4, 6 и 8.

N. Автодополнение
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
1024 мегабайта
ввод
стандартный ввод
вывод
стандартный вывод

Создатели операционной системы «Икс» сделали ставку на работу в терминале и включили в дистрибутив оболочку SuperShell.

Работая в SuperShell, можно вводить название интересующего файла посимвольно либо использовать Tab для автоматического дополнения.

Нажатие клавиши Tab работает следующим образом. Рассмотрим подмножество имен файлов директории, префикс которых совпадает с уже написанной в SuperShell строкой. В результате нажатия Tab написанная строка дополнится до максимального по длине общего префикса среди файлов в этом подмножестве. 

Фредди — один из разработчиков «Икс» — тестировал работу оболочки и, оказавшись в директории с логами, задумался, какое минимальное количество символов понадобится набрать на клавиатуре, чтобы открыть нужный файл. Нажатие Tab также считается вводом символа.

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

В первой строке указано число $$$N$$$ ($$$1 \le N \le 2000$$$) — количество файлов в директории.

Далее следуют $$$N$$$ строк, каждая из которых содержит строку $$$f_i$$$ ($$$1 \le i \le N$$$, $$$1 \le |f_i| \le 2000$$$), состоящую из строчных латинских букв — имена файлов в директории, причем нужный Фредди файл указан первым.

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

Выведите одно число — минимальное количество нажатий клавиш, которое потребуется Фредди.

Пример
Входные данные
4
bacb
ab
baca
caa
Выходные данные
3
Примечание

Чтобы открыть нужный файл из примера, Фредди достаточно нажать: $$$b$$$ — Tab — $$$b$$$.