Какой день будет после каникул
Условие
У Вари в дневнике дни недели закодированы числами:
- 0 — понедельник
- 1 — вторник
- 2 — среда
- 3 — четверг
- 4 — пятница
- 5 — суббота
- 6 — воскресенье
Сегодня у неё день с кодом s. Через n дней она хочет заранее подписать расписание и узнать, какой код будет у того дня.
Важно: n может быть очень большим (как на олимпиадах, может не помещаться в 32-битный тип), поэтому нужен расчёт без перебора дней по одному.
Формат ввода
В первой строке два целых числа s и n.
Формат вывода
Выведите одно целое число — код дня недели через n дней.
Ограничения
0 ≤ s ≤ 60 ≤ n ≤ 1_000_000_000- значения могут быть больше 32-битного типа (ориентируйтесь на 64-битные целые)
Пример
Ввод:
4 3
Вывод:
0
(Если сегодня пятница (4), то через 3 дня будет понедельник (0).)
Как решать — идея подхода
Приём: Остаток по модулю (циклы длины 7)
Ключевое наблюдение: коды дней недели идут по кругу длины 7. После воскресенья (6) снова идёт понедельник (0). Значит, нам не важно «сколько всего дней», важен только остаток от деления количества сдвигов на 7.
Приём: арифметика по модулю 7. Она здесь работает, потому что состояние (код дня) повторяется каждые 7 шагов. Если прибавить 7, 14, 21… дней, код не изменится.
План решения:
- Считать
sиn. - Посчитать, на сколько реально сдвигаемся внутри недели:
k = n % 7. - Прибавить сдвиг к текущему коду и снова «закольцевать» по 7: ответ
(s + k) % 7. - Вывести получившийся код.
Мини-сниппет формулы:
ans = (s + n) % 7
Сложность: O(1) по времени и O(1) по памяти — никаких циклов по дням.
Частая ошибка: забыть про второй модуль после сложения (или попытаться делать n шагов циклом). Даже если n большой, модуль сразу даёт правильный результат.
Разберись руками
Сегодня код дня недели 4 (пятница). Нужно узнать код дня через 3 дня, помня, что после 6 (воскресенье) счёт снова идёт с 0 (понедельник).
- Прогони 3 шага «+1 день», начиная с кода 4. Какой код будет после каждого шага?
- Теперь посчитай просто сумму: 4 + 3 = ?
- Если «сворачивать» по 7 дням, какой остаток получится при делении 7 на 7?
Идея: Сложи код сегодняшнего дня и количество прошедших дней, а затем «сверни» результат в диапазон 0–6: убери из него целые недели (по 7 дней) и оставь только остаток.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Перечневые олимпиады по информатике — олимпиады перечня Минобрнауки, их уровни и что нужно к диплому
- БВИ по олимпиадам: в какие вузы берут — правила приёма вузов, разобранные построчно, со ссылкой на приказ у каждой строки