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

Забор состоит из $$$N$$$ досок. В день космонавтики Петя на каждой четвёртой доске (4, 8, 12 ...) нарисовал космический корабль. На каждой пятой доске (5, 10, 15 ...) Вася нарисовал луноход. На каждой шестой доске (6, 12, 18 ...) Маша нарисовала орбитальную станцию.

Определите количество досок только с одним рисунком.

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

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

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

Ваша программа должна вывести одно целое число — количество досок с одним рисунком.

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

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

Студент Василий купил новую машину. Ну, почти новую. В конце концов, разве 10 лет — это возраст для хорошего автомобиля?

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

Сначала он заправил полный бак, затем проехал $$$A$$$ километров по городу и $$$B$$$ километров по трассе и снова заправил полный бак. При этом в бак влезло $$$P$$$ литров бензина. Затем он проехал $$$C$$$ километров по городу и $$$D$$$ километров по трассе и ещё раз заправил полный бак. При этом в него влезло $$$Q$$$ литров бензина.

Определите расход бензина на 100 километров по городу и по трассе.

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

В первой строке записаны три целых числа $$$A$$$, $$$B$$$, $$$P$$$ ($$$0 \le A, B \le 1000$$$, $$$100 \le A + B \le 1000$$$, $$$5 \le P \le 100$$$).

Во второй строке записаны три целых числа $$$C$$$, $$$D$$$, $$$Q$$$ ($$$0 \le C, D \le 1000$$$, $$$100 \le C + D \le 1000$$$, $$$5 \le Q \le 100$$$).

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

Если по входным данным можно найти ответ однозначно, и оба числа в ответе положительны, то в первой строке выведите слово «Success», а во второй строке выведите два вещественных числа — сколько литров бензина израсходует автомобиль, проехав 100 километров по городу, и проехав 100 километров по трассе. Абсолютная или относительная погрешность не должна превышать $$$10^{-1}$$$.

Если входные данные противоречивы, то выведите «Contradiction».

Если входные данные непротиворечивы, ответ однозначен, но хотя бы одно из чисел в ответе не положительно, то выведите «Not positive».

Если входные данные непротиворечивы, но не позволяют найти ответ однозначно, то выведите «Ambiguity».

Примеры
Входные данные
250 150 49
200 200 46
Выходные данные
Success
14.500 8.500
Входные данные
100 100 50
100 100 30
Выходные данные
Contradiction
Входные данные
100 100 50
100 100 50
Выходные данные
Ambiguity
Входные данные
100 900 100
900 100 10
Выходные данные
Not positive
Примечание

Ситуация, когда автомобиль по трассе потребляет больше топлива, чем по городу, не считается ошибочной.

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

В некоторой местности имеется $$$n$$$ городов. Некоторые пары городов соединены двухсторонними дорогами. Любые два города соединены напрямую не более чем одной дорогой.

Студент Василий хочет доехать на своём автомобиле от города 1 до города $$$n$$$. Он заранее рассчитал для каждой дороги, сколько литров бензина нужно, чтобы проехать по этой дороге на его машине.

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

Цена за литр бензина в разных городах может быть разной. Определите, какую наименьшую сумму денег должен потратить Василий, чтобы добраться из города 1 в город $$$n$$$. Также определите его маршрут движения и сколько литров бензина он должен купить в каждом городе по пути.

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

В первой строке входных данных записаны два целых числа $$$n$$$ и $$$m$$$ — количество городов и количество дорог ($$$2 \le n \le 1000$$$, $$$0 \le m \le 10000$$$).

В следующей строке записаны $$$n$$$ целых чисел $$$c_i$$$ — стоимость литра бензина в каждом городе ($$$1 \le c_i \le 100$$$).

В следующих $$$m$$$ строках записана информация о дорогах — тройки целых чисел $$$u_i$$$, $$$v_i$$$ и $$$f_i$$$, где $$$u_i$$$ и $$$v_i$$$ — города, которые соединяет очередная дорога ($$$1 \le u_i, v_i \le n$$$, $$$u_i \ne v_i$$$), $$$f_i$$$ — количество бензина, требуемое для проезда по этой дороге ($$$1 \le f_i \le 100$$$).

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

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

Если от города 1 нельзя доехать до города $$$n$$$, то выведите -1.

Примеры
Входные данные
5 5
50 40 10 100 75
1 2 4
1 4 3
2 5 9
3 4 5
4 5 10
Выходные данные
550
5
1 8
4 0
3 15
4 0
5 0
Входные данные
4 2
10 20 30 40
1 2 50
3 4 100
Выходные данные
-1
Примечание

Рисунок к первому примеру:

Рядом с вершинами подписаны стоимости бензина, рядом с рёбрами — расход в литрах. В примере мы заправляем 8 литров в городе 1, едем в город 4, далее заезжаем в город 3 за дешёвым бензином и заправляем там 15 литров, возвращаемся в город 4 и едем в город 5.

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

Вдоль прямой дороги установлены $$$n$$$ мин. Мина с номером $$$i$$$ находится в точке с координатой $$$x_i$$$ и имеет дальность действия $$$d_i$$$. При взрыве этой мины также взорвутся все мины с координатами от $$$x_i-d_i$$$ до $$$x_i+d_i$$$ включительно (а они, в свою очередь, могут вызвать взрывы других мин, и так далее).

Определите, сколько всего мин взорвётся, если взорвать мину номер $$$k$$$.

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

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

Во второй строке записаны $$$n$$$ несовпадающих целых чисел $$$x_1$$$, $$$x_2$$$, ..., $$$x_n$$$ в порядке возрастания ($$$0 \le x_i \le 10^9$$$).

В третьей строке записаны $$$n$$$ целых чисел $$$d_1$$$, $$$d_2$$$, ..., $$$d_n$$$ ($$$0 \le d_i \le 10^9$$$).

В четвёртой строке записано целое число $$$k$$$ ($$$1 \le k \le n$$$).

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

Выведите одно целое число — количество взорвавшихся мин.

Пример
Входные данные
5
0 10 30 50 100
40 10 25 20 10
2
Выходные данные
4
Примечание

В примере вторая мина вызовет взрыв первой, первая — взрыв третьей, третья — взрыв четвёртой.

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

Это задача с двойным запуском.

IT-компания «Костыли и велосипеды» разработала новый текстовый мессенджер, позволяющий обмениваться сообщениями в виде строк из заглавных латинских букв длиной не более 1000 символов.

К сожалению, в код вкралась ошибка: при передаче сообщения одна из букв может неожиданно замениться на какую-то другую. Разработчики никак не могут найти ошибку в коде, поэтому они решили сделать «костыль»: кодировать сообщения так, чтобы их можно было однозначно восстановить при условии, что испортилось не более одной буквы. При этом разработчики хотят, чтобы закодированная строка также состояла только из заглавных латинских букв, а её длина превышала длину исходной строки не более чем на 10 символов.

Разработайте какой-нибудь способ кодирования и декодирования, удовлетворяющий данным требованиям.

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

Первая строка входных данных содержит число $$$t$$$, равное 1 или 2.

Если $$$t=1$$$, то вторая входная строка содержит сообщение, которое нужно закодировать. Оно составлено из заглавных латинских букв и имеет длину от 1 до 1000 символов.

Если $$$t=2$$$, то вторая входная строка содержит закодированное ранее вашей программой сообщение, которое требуется декодировать. Не более одного символа в этой строке может быть заменено на произвольную заглавную латинскую букву.

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

Выведите одну строку из заглавных латинских букв — закодированное либо раскодированное сообщение.

Пример
Входные данные
1
ABC
Выходные данные
AAABBBCCC
Входные данные
2
AXABBBCCC
Выходные данные
ABC

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

Вводится перестановка натуральных чисел от 1 до $$$n$$$. Найдите в ней такие два непересекающихся отрезка, что если их поменять местами, то перестановка станет отсортированной по возрастанию.

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

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

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

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

Если решение существует, выведите четыре целых числа $$$pos_1$$$, $$$len_1$$$, $$$pos_2$$$ и $$$len_2$$$, где $$$pos_1$$$ — позиция первого элемента первого отрезка (нумерация идёт с единицы), $$$len_2$$$ — длина первого отрезка, $$$pos_2$$$ и $$$len_2$$$ — то же самое для второго отрезка. Должно выполняться неравенство $$$pos_1 \lt pos_2$$$.

Если решения не существует, выведите одно число -1.

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

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

Вводится корректное арифметическое выражение, которое может содержать только целые числа в диапазоне от 0 до 9, круглые скобки и знаки бинарных операций '+' и '-'.

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

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

В единственной строке входных данных вводится корректное выражение в вышеописанном формате, содержащее не более 100 чисел и не более 100 скобок.

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

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

Примеры
Входные данные
1+(2)-(3-(4-5))
Выходные данные
9
1+(2)-(3-4-5)
Входные данные
1-(2-3)
Выходные данные
2
1-(2-3)

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

На доске написаны натуральные числа от 1 до $$$n$$$. Требуется выбрать некоторые из них так, чтобы среди выбранных чисел оказалась ровно одна пара соседей (то есть чисел, отличающихся на единицу). Определите, сколькими способами это можно сделать.

Например, при $$$n=4$$$ ответом будет 5 — это следующие 5 способов: {1, 2}, {2, 3}, {3, 4}, {1, 2, 4}, {1, 3, 4}.

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

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

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

Выведите одно целое число — количество способов по модулю $$$10^9+7$$$ (то есть остаток от деления количества способов на число $$$10^9+7$$$).

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

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

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

Агент 008 играет в казино в рулетку. В каждом раунде он ставит на цвет (красное или чёрное). В случае проигрыша ставку забирает казино, а в случае выигрыша возвращается удвоенная ставка. Известно, что агент никогда не проигрывает больше трёх раз подряд.

Перед походом в казино агент получил в кассе 200 фунтов. Помимо этого, он ещё нашёл в кармане мятую десятку, и в итоге у него оказалась начальная сумма 210 фунтов. Помогите ему увеличить эту сумму до 1000 (или более) фунтов, сыграв не более 100 раз.

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

Ваша программа должна в цикле делать следующее.

Выведите целое положительное число — сумму ставки (такая сумма должна иметься в наличии), затем через пробел букву R или B (R — красное, B — чёрное) и перевод строки. Сразу после вывода выполните сброс буфера в стандартный поток (смотрите примечание).

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

Пример ввода-вывода:

вывод:
1 R
ввод:
0
вывод:
2 B
ввод:
1
...(и так далее)
Примечание

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

Сброс буфера вывода в выходной поток на разных языках делается следующим образом:

  • на языке C++ достаточно после вывода в cout вывести туда std::endl или std::flush (в первом варианте также автоматически выполнится перевод строки)
  • на языке Java после каждого вывода нужно использовать метод flush у потока вывода, например: System.out.flush();
  • на языке Python можно импортировать модуль sys и после каждого вывода вызывать sys.stdout.flush()
  • на языке Pascal после каждого вывода можно вызывать flush(output);
  • на языке C# после каждого вывода можно вызывать Console.Out.Flush();

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

Для заданного натурального числа $$$n$$$ найдите такие $$$n+1$$$ положительных целых чисел, не превосходящих $$$10^9$$$, что сумма квадратов первых $$$n$$$ этих чисел равна квадрату последнего из них.

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

Вводится одно целое число $$$n$$$ ($$$1 \le n \le 1000$$$).

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

Выведите $$$n+1$$$ целое число в диапазоне от 1 до $$$10^9$$$. Если есть несколько правильных ответов, выведите любой. Если решений нет, выведите одно число -1.

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

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

Петя очень любит играть в компьютерные игры. Сейчас он играет в очередную игру, и только что обнаружил дверь на секретный уровень.

На стене рядом с дверью имеется квадратное поле размером $$$n$$$ x $$$n$$$ клеток. Часть клеток — чёрные, остальные — белые. Если нажать на любую из клеток, то её цвет изменится на противоположный (чёрный — на белый, а белый — на чёрный). При этом аналогично поменяются и цвета всех соседних (по стороне) клеток. Дверь откроется, если все клетки станут одинакового цвета.

Помогите Пете открыть дверь, сделав минимальное количество нажатий.

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

В первой строке входных данных записано целое число $$$n$$$ ($$$2 \le n \le 20$$$). В следующих $$$n$$$ строках записаны по $$$n$$$ символов 'b' или 'w', где 'b' означает чёрный цвет, 'w' — белый.

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

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

Если решения нет, выведите одно число -1.

Примеры
Входные данные
2
wb
bw
Выходные данные
2
1 2
2 1
Входные данные
3
bbb
bbb
bbb
Выходные данные
0
Входные данные
4
bbbb
wwwb
bbbb
bwww
Выходные данные
-1
Примечание

Рисунок к первому примеру: