Какой день будет после каникул

тема: Арифметика и формулы (O(1)) · уровень: базовый

Условие

У Вари в дневнике дни недели закодированы числами:

Сегодня у неё день с кодом s. Через n дней она хочет заранее подписать расписание и узнать, какой код будет у того дня.

Важно: n может быть очень большим (как на олимпиадах, может не помещаться в 32-битный тип), поэтому нужен расчёт без перебора дней по одному.

Формат ввода

В первой строке два целых числа s и n.

Формат вывода

Выведите одно целое число — код дня недели через n дней.

Ограничения

Пример

Ввод:

4 3

Вывод:

0

(Если сегодня пятница (4), то через 3 дня будет понедельник (0).)

Как решать — идея подхода

Приём: Остаток по модулю (циклы длины 7)

Ключевое наблюдение: коды дней недели идут по кругу длины 7. После воскресенья (6) снова идёт понедельник (0). Значит, нам не важно «сколько всего дней», важен только остаток от деления количества сдвигов на 7.

Приём: арифметика по модулю 7. Она здесь работает, потому что состояние (код дня) повторяется каждые 7 шагов. Если прибавить 7, 14, 21… дней, код не изменится.

План решения:

Мини-сниппет формулы:

Сложность: O(1) по времени и O(1) по памяти — никаких циклов по дням.

Частая ошибка: забыть про второй модуль после сложения (или попытаться делать n шагов циклом). Даже если n большой, модуль сразу даёт правильный результат.

Разберись руками

Сегодня код дня недели 4 (пятница). Нужно узнать код дня через 3 дня, помня, что после 6 (воскресенье) счёт снова идёт с 0 (понедельник).

Идея: Сложи код сегодняшнего дня и количество прошедших дней, а затем «сверни» результат в диапазон 0–6: убери из него целые недели (по 7 дней) и оставь только остаток.

Решить задачу с автопроверкой на Python →

Куда дальше