Содержание
- Условие задачи
- Математический анализ (делимость на 3)
- Алгоритм решения
- Доказательство корректности
- Оценка сложности
- Реализация (Python)
- Примеры ввода‑вывода
Условие задачи
Вася любит математику и верит в собственные «приметы». Когда он видит номер машины,
квартиры или любой трехзначный номер, он берёт его цифры a, b и c
и вычисляет три попарные суммы:
a + bb + ca + c
Если хотя бы одна из этих сумм делится на 3, то Вася загадывает желание.
Даны три целых числа a, b и c (каждое от 0 до 9). Нужно
определить, загадает ли Вася желание. Вывести слово «да», если условие выполнено,
и «нет» в противном случае.
Формат ввода
a b c
Формат вывода
да // если хотя бы одна из сумм делится на 3 нет // иначе
Математический анализ (делимость на 3)
Ключевой факт: число делится на 3 тогда и только тогда, когда сумма его цифр делится на 3.
Для попарных сумм это значит, что нам достаточно проверить остатки от деления
каждой суммы на 3.
Обозначим:
s1 = (a + b) mod 3s2 = (b + c) mod 3s3 = (a + c) mod 3
Если s1 = 0 или s2 = 0 или s3 = 0, то ответ «да».
Иначе – «нет».
Поскольку a, b, c ≤ 9, вычисления выполняются за константное время.
Алгоритм решения
- Прочитать три целых числа
a, b, c. - Вычислить три попарные суммы:
a+b,b+c,a+c. - Для каждой суммы проверить условие
sum % 3 == 0. - Если условие истинно хотя бы для одной суммы – вывести «да», иначе – вывести «нет».
Доказательство корректности
Теорема. Алгоритм выводит «да» тогда и только тогда, когда хотя бы одна из
попарных сумм цифр делится на 3.
Доказательство.
- Если часть алгоритма выводит «да». Это происходит только в случае,
когда найдено хотя бы одно из условий(a+b) % 3 == 0,
(b+c) % 3 == 0или(a+c) % 3 == 0. По определению делимости
на 3 это эквивалентно тому, что соответствующая сумма делится на 3.
Следовательно, условие задачи выполнено. - Если условие задачи выполнено. По условию существует пара цифр,
сумма которых кратна 3. Алгоритм проверяет все три возможные пары, поэтому
он обязательно обнаружит эту пару и выведет «да».
Таким образом, алгоритм корректен.
Оценка сложности
Время выполнения: O(1) – фиксированное количество арифметических операций.
Память: O(1) – несколько целочисленных переменных.
Реализация (Python 3)
#!/usr/bin/env python3
import sys
def main -> None:
data = sys.stdin.read.strip.split
if len(data) != 3:
return
a, b, c = map(int, data)
# проверяем три попарные суммы
if (a + b) % 3 == 0 or (b + c) % 3 == 0 or (a + c) % 3 == 0:
print("да")
else:
print("нет")
if __name__ == "__main__":
main
Код полностью соответствует описанному алгоритму и проходит все тесты.
Примеры ввода‑вывода
Пример 1
1 2 3
Суммы: 1+2=3 (делится), 2+3=5, 1+3=4 → хотя бы одна делится → да
да
Пример 2
4 7 2
Суммы: 4+7=11, 7+2=9 (делится), 4+2=6 (делится) → да
да
Пример 3
5 1 4
Суммы: 5+1=6 (делится), 1+4=5, 5+4=9 (делится) → да
да
Пример 4
2 2 2
Суммы: 2+2=4, 2+2=4, 2+2=4 → ни одна не делится на 3 → нет
нет
Задача иллюстрирует простую, но часто встречающуюся в конкурсных
программированиях технику работы с остатками от деления. Благодаря свойству
делимости на 3, достаточно лишь проверить три фиксированных суммы,
что позволяет решить задачу за константное время и память.
Если у вас возникли вопросы или вы хотите обсудить варианты оптимизации
(например, использовать только остатки от деления входных цифр), пишите
в комментариях – будем рады помочь!
Контактная информация
Если необходимо связаться с автором статьи, используйте форму обратной связи
на сайте или напишите на почту
support@example.com.