Вы находитесь на странице: 1из 2

Подготовка к областной олимпиаде

Марафон - 2022

Задача E. Получите из числа A число B


Ограничение по времени: 0.2 секунды
Ограничение по памяти: 64 мегабайта
У вас есть натуральное число 𝐴. Вы хотите из числа 𝐴 получить число 𝐵 (𝐵 > 𝐴). За одну секунду вы
можете увеличить число на 1 или на 2 (𝐴 → 𝐴 + 1 или 𝐴 → 𝐴 + 2). Если в процессе такого увеличения число
вдруг станет кратным числу 𝐶, то оно обнулится!
Напишите программу, которая определит, за сколько секунд можно получить число 𝐵 из числа 𝐴.
Формат входных данных
Входные данные содержит три целых числа: 𝐴, 𝐵 и 𝐶, по одному на строке (1 6 𝐴 < 𝐵 6 109 , 2 6 𝐶 6 109 ,
𝐴 не кратно 𝐶, 𝐵 не кратно 𝐶).
Формат выходных данных
Выведите одно число − минимальное количество секунд, необходимое для того, чтобы из числа 𝐴 полу-
чить число 𝐵.
Примеры
тест ответ
2 3
7
3
4 4
10
3

Пояснения к примерам
В первом примере можно действовать следующим образом: 2 → 4 → 5 → 7. Во втором примере можно
действовать следующим образом: 4 → 5 → 7 → 8 → 10.

Страница 5 из 24
Подготовка к областной олимпиаде
Марафон - 2022

Разбор задачи «Получите из числа A число B»


Решение.

Для маленьких значений 𝐴 и 𝐵 можно использовать полный перебор вариантов. Время работы полного
перебора составляет 𝑂(2𝐵−𝐴 ).

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


𝑑𝑝[𝑖] минимальное количество секунд для получения числа 𝑖.

Тогда 𝑑𝑝[𝑖] = 𝑚𝑖𝑛(𝑑𝑝[𝑖 − 1], 𝑑𝑝[𝑖 − 2]) + 1, если 𝑖 не кратно 𝐶 и 𝑑𝑝[𝑖] = +∞, если 𝑖 кратно 𝐶. Время работы
этого решения 𝑂(𝐵 − 𝐴).

Целесообразно рассмотреть частный случай, где 𝐶 = 2. Тогда оптимальна следующая последователь-


ность: необходимо (𝐵 − 𝐴)/2 раз увиличивать чило на 2, поскольку 𝐵 и 𝐴 оба нечетны, все промежуточные
значения будут нечетными.

Перейдем теперь к полному решению. Рассмотрим два соседних значения, кратных 𝐶 и числа между
ними: 𝐶 · 𝑘, 𝐶 · 𝑘 + 1, 𝐶 · 𝑘 + 2, . . . , 𝐶 · (𝑘 + 1).

Заметим, что, поскольку значение равное 𝐶 · 𝑘 запрещено, первое из этих значений, которое можно полу-
чить, равно 𝐶 ·𝑘 +1. Будем далее увеличивать число на 2, пока не получим одно из двух значений: 𝐶 ·𝑘 +𝑘 −2
или 𝐶 · 𝑘 + 𝑘 − 1. В первом случае далее следует увеличить число на 1, чтобы получить значение 𝐶 · 𝑘 + 𝑘 − 1.
Теперь, увеличив число на 2, мы переходим в следующий отрезок чисел между кратными 𝐶.

Итого для «преодоления» такого отрезка требуется ⌊(𝑐 + 1)/2⌋ секунд (здесь ⌊𝑥⌋ означает 𝑥, округленное
вниз).

Осталось разобраться с начальным отрезком от 𝐴 до первого числа, кратного 𝐶 и с заключительным


отрезком от последнего числа кратного 𝐶 до 𝐵. Это можно сделать аналогично. Наконец, следует не забыть
о случае, когда между 𝐴 и 𝐵 совсем нет чисел, кратных 𝐶, в этом случае ответ равен ⌈(𝐵 − 𝐴)/2⌉.

Страница 6 из 24

Вам также может понравиться