XXV Межрегиональная олимпиада по программированию, Вологда, ВоГУ, 2023
A. Наташа и коты
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Дома у Наташи живёт несколько котов. Известно, что за ночь один кот роняет от $$$A$$$ до $$$B$$$ плохо закреплённых предметов (а таких предметов у Наташи бесконечно много).

Однажды ночью Наташа сквозь сон $$$N$$$ раз услышала, как что-то упало. Определите, какое наименьшее число котов может у неё жить.

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

Вводятся три целых числа $$$A$$$, $$$B$$$ и $$$N$$$, каждое в отдельной строке.

Ограничения: $$$0 \le A, B, N \le 10^9$$$, $$$A \le B$$$.

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

Выведите одно целое неотрицательное число — минимальное количество котов у Наташи. Если решения нет, то выведите -1.

Примеры
Входные данные
2
3
5
Выходные данные
2
Входные данные
2
2
3
Выходные данные
-1

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

В ряд лежат 2*N+1 пустых карточек. Петя на каждой чётной карточке пишет по своему усмотрению знак ">" или "<". Сможет ли Вася вписать на нечётные карточки числа от 1 до (N+1) так, чтобы все неравенства были верными? Каждое число должно быть написано ровно один раз.

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

В первой строке дано натуральное число N ($$$N\le10^5$$$). Во второй строке дана последовательность из N знаков ">" и "<", разделённых пробелами.

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

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

Пример
Входные данные
2
< >
Выходные данные
1 3 2

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

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

  1. Цифры от 0 до 9
  2. Круглые скобки
  3. Символ '*', означающий любое количество повторений символа или подвыражения в скобках, которое записано перед ним. Например, выражение '345*6' означает, что после подстроки '34' идёт ноль или более цифр '5', затем цифра '6'. Выражение '3(45)*6' означает, что после символа '3' может идти ноль или более повторений подстроки '45', затем цифра '6'.
  4. Символ '|', означающий операцию 'ИЛИ'. Приоритет данной операции меньше, чем приоритет неявной операции склеивания. Например, выражение '12|345' означает строку '12' или строку '345'. Выражение '(12|34)5' означает, что вначале идёт либо '12', либо '34', а затем '5'.

Одно из применений регулярных выражений — проверка, соответствует ли строка заданному шаблону. Например, чтобы проверить, является ли введённое целое неотрицательное число чётным, можно написать такое выражение (для простоты разрешим ведущие нули): (0|1|2|3|4|5|6|7|8|9)*(0|2|4|6|8)

От вас требуется решить более сложную задачу. Нужно определить, можно ли в целом неотрицательном числе переставить цифры так, чтобы число стало делиться на 6. Например, в числе 123 цифры нужным образом переставить можно, а в числе 31 — нельзя. Составьте регулярное выражение для выполнения такой проверки.

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

Входные данные отсутствуют.

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

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

Примечание

Правильность вашего регулярного выражения будет проверяться на различных целых числах в диапазоне от $$$0$$$ до $$$10^9$$$ включительно (без ведущих нулей). Для проверки будет использоваться функция regex_match из библиотеки regex языка C++ (компилятор GCC). Время проверки не должно превышать одной секунды (в случае превышения будет возвращаться вердикт 'Неправильный ответ').

Для информации: в первом тесте проверяется число 123, во втором — 31.

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

Маленькая девочка Кристина приехала в гости к бабушке и увидела старинные механические часы, на циферблате которых было две стрелки — часовая и минутная. Часы исправно ходили, при этом перемещение стрелок у таких часов непрерывное (а не дискретное), то есть, например, за 1 минуту минутная стрелка равномерно перемещается на 6 градусов, а часовая — на 0.5 градуса. В момент наблюдения часы показывали ровно h часов, m минут, 0 секунд (то есть минутная стрелка указывала ровно на отметку m минут на циферблате). Например, часы на рисунке ниже показывают 8 часов 23 минуты и 0 секунд времени.

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

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

В единственной строке входных данных заданы три целых числа — h, m и k ($$$0 \le h \le 11$$$, $$$0 \le m \le 59$$$, $$$0 \le k \le 180$$$).

Будем считать, что часы показывают время от 0 часов 0 минут до 11 часов 59 минут. После 11:59 снова следует 0:00.

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

В единственную строку выведите три числа — часы, минуты и секунды требуемого момента времени. При необходимости округлите время до целого числа секунд в меньшую сторону.

Пример
Входные данные
6 30 90
Выходные данные
6 49 5

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

Некоторая тропическая республика представляет собой архипелаг, состоящий из нескольких (не менее двух) островов. Карта архипелага представляет собой матрицу $$$n \times m$$$, в которой символ '1' означает землю, а цифра '0' — воду. Любые две соседние по стороне клетки с символом '1' принадлежат одному острову.

Свежеизбранный президент республики в ходе предвыборной гонки обещал соединить все острова мостами. Теперь обещание нужно выполнять, но денег в стране немного. Поэтому он решил начать с возведения самого маленького моста. Определите, какое наименьшее число клеток нужно изменить с '0' на '1', чтобы какие-нибудь два острова (или более) соединились.

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

В первой строке записаны два целых числа $$$n$$$ и $$$m$$$ ($$$1\le n, m \le 10^6$$$, $$$n \cdot m \le 10^6$$$).

В следующих $$$n$$$ строках записано по $$$m$$$ символов '0' или '1' без пробелов. Гарантируется, что в матрице имеется не менее двух связных по стороне областей из единичных клеток.

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

Выведите одно целое число — ответ.

Примеры
Входные данные
3 3
101
010
101
Выходные данные
1
Входные данные
2 3
100
001
Выходные данные
2

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

Вася считает сумму 2+22+202+2002+...20...02 и среди подряд идущих цифр получившегося результата хочет увидеть своё счастливое четырёхзначное число $$$N$$$. Помогите Васе определить, какое наименьшее количество слагаемых ему нужно взять, чтобы в десятичной записи такой суммы встретился фрагмент, совпадающий с его счастливым числом $$$N$$$.

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

Вводится целое число $$$N$$$ ($$$1000 \le N \le 9999$$$).

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

Выведите наименьшее количество слагаемых, сумма которых позволит Васе увидеть фрагмент в виде его счастливого числа, если это возможно, в противном случае выведите -1.

Примеры
Входные данные
2230
Выходные данные
5
Входные данные
2023
Выходные данные
49005

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

На кружке электроники студенты разработали необычный калькулятор. Он отображает на экране не одно число, а сразу два, и поддерживает три вида команд:

  1. из (m, n) получить (m - n, n)
  2. из (m, n) получить (m + n, n)
  3. из (m, n) получить (n, m)

Определите последовательность команд, чтобы получить из пары чисел (a, b) пару (c, d).

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

В первой строке записаны целые числа a и b, во второй строке — целые числа c и d ($$$-10^5 \le a, b, c, d \le 10^5$$$, $$$a \ne c$$$ или $$$b \ne d$$$).

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

Выведите одну строку, состоящую только из цифр 1, 2 и 3 без пробелов — номера команд. От вас не требуется, чтобы количество команд было минимальным, но оно не должно превышать $$$10^6$$$. В ходе вычислений не должны получаться числа больше $$$10^{18}$$$ по модулю.

Если решения нет, выведите "IMPOSSIBLE" (без кавычек, все буквы большие).

Примеры
Входные данные
-3 5
3 2
Выходные данные
231
Входные данные
3 6
2 3
Выходные данные
IMPOSSIBLE

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

На доске прикреплены $$$N$$$ карточек, на каждой из которых записаны два целых числа — одно слева, другое справа. На обратной стороне одной из карточек написано слово "Приз".

В игре участвуют два игрока. Первому игроку ведущий шёпотом на ухо сообщает только левое число на призовой карточке, а второму игроку — только правое. Игрокам запрещено явным образом называть свои числа друг другу, но они могут давать подсказки. Если оба игрока отгадают нужную карточку, то они поделят приз между собой. При этом чем менее очевидными будут подсказки, тем ценнее приз им достанется.

Как-то раз на одной из игр между игроками случился следующий диалог:

  • Игрок 1: Я знаю, что ты не знаешь призовую карточку. И я её тоже не знаю.
  • Игрок 2: Спасибо, теперь я знаю призовую карточку.
  • Игрок 1: Спасибо, теперь и я тоже знаю.

После этого один из зрителей в зале воскликнул: "Я тоже знаю!". А вы сможете определить призовую карточку?

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

Первая строка входных данных содержит положительное целое число $$$N$$$ — количество карточек ($$$N \le 100$$$). Каждая из следующих $$$N$$$ строк содержит описание карточки — два целых числа от 1 до 100 через пробел, сначала левое, потом правое. Повторяющихся пар нет. Гарантируется, что ведущий, игроки и зритель говорят правду и не ошибаются.

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

Выведите два числа на карточке с призом — сначала левое, затем через пробел правое.

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

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

Возможно, вы знакомы со следующей известной задачей. Путешественник снял в гостинице комнату на неделю и предложил хозяину в уплату цепочку из семи серебряных колец — по кольцу за день, с тем, однако, условием, что будет рассчитываться ежедневно. Какое минимальное количество колец цепочки ему придётся разрезать?

Решение у этой задачи следующее. Оказывается, достаточно разрезать всего одно кольцо — третье. Тогда у путешественника будет три куска цепочки — из двух, одного и четырёх колец. В первый день он отдаст хозяину одно кольцо. Во второй день он отдаст кусок из двух колец и заберёт обратно кольцо, которое отдал в первый день, и так далее.

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

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

Вводится одно целое число $$$N$$$ ($$$1 \le N \le 10^9$$$).

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

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

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

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

Вам дан исходный код некоторой программы, для удобства он приведён на нескольких популярных языках программирования. Данная программа читает два целых числа $$$a$$$ и $$$n$$$ и затем выводит одно целое число — ответ.

При больших входных данных эта программа может работать довольно долго. Ваша задача — написать альтернативную программу, которая будет выдавать точно такие же ответы, но работать не более одной секунды при любых входных $$$a$$$ и $$$n$$$ в диапазоне от $$$0$$$ до $$$10^{18}$$$.

Текст на C++:

#include <iostream>

int main() {
long long a, n;
std::cin >> a >> n;
long long b = 0;
for (long long i = 0; i < n; i++) {
b = (b - a) & a;
}
std::cout << b << std::endl;
}
Текст на Python:
a = int(input())
n = int(input())
b = 0
for _ in range(n):
b = (b - a) & a
print(b)

Текст на Java:

import java.util.Scanner;

public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long a = in.nextLong();
long n = in.nextLong();
long b = 0;
for (long i = 0; i < n; i++) {
b = (b - a) & a;
}
System.out.println(b);
}
}

Текст на C#:

using System;

public class Solution {
static void Main() {
long a = long.Parse(Console.ReadLine());
long n = long.Parse(Console.ReadLine());
long b = 0;
for (long i = 0; i < n; i++) {
b = (b - a) & a;
}
Console.WriteLine(b);
}
}

Текст на Pascal:

var
a, b, n, i: int64;
begin
read(a, n);
b := 0;
i := 0;
while i < n do begin
b := (b - a) and a;
inc(i);
end;
writeln(b);
end.
Входные данные

Первая строка входных данных содержит целое число $$$a$$$, вторая строка содержит целое число $$$n$$$ ($$$0 \le a, n \le 10^{18}$$$).

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

Выведите одно целое число — ответ.

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

Предполагается, что отрицательные целые числа в памяти представляются в дополнительном коде как в большинстве популярных процессорных архитектур (включая архитектуру x86-64). В дополнительном коде отрицательное число $$$-x$$$ сохраняется в памяти как дополнение до двойки в степени числа разрядов, то есть $$$2^{64}-x$$$.

Заметим, что в языке Питон целые числа не ограничены фиксированной разрядностью. Но это не влияет на ответ, поэтому вы можете считать, что утверждение выше верно и для Питона.