Кристалл цифровой силы

тема: Теория чисел (НОД, НОК, остатки) · уровень: базовый

Условие

В одной игре у героя есть «кристалл силы» с числом X. После каждого боя кристалл «сжимает» число: заменяет его на сумму его цифр. Если получившееся число всё ещё двузначное или больше — сжатие повторяется, пока не останется ровно одна цифра.

Твоя задача — узнать, какая цифра останется в кристалле.

Важно: X может быть до 10^18, то есть больше 32-битного типа (как на олимпиадах). В Python это не проблема.

Формат ввода

Одно целое число X.

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

Одну цифру — итоговое число в кристалле после всех сжатий.

Ограничения

Пример

Ввод:

987654

Вывод:

3

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

Приём: Цифровой корень (остаток по 9)

Ключевое наблюдение: сколько бы раз ты ни заменял число на сумму его цифр, итоговая одна цифра называется цифровой корень. Он почти всегда равен остатку числа по 9 — потому что число и сумма его цифр дают один и тот же остаток при делении на 9 (из-за того, что 10 ≡ 1 (mod 9), значит 10^k ≡ 1).

Почему это работает здесь: вместо многократных «сжатий» (которые выглядят как цикл) можно сразу получить ответ за O(1), даже если X до 10^18.

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

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

Сложность: по времени O(1), по памяти O(1).

Частая ошибка: забыть про X = 0. Для нуля цифровой корень не 9, а 0, поэтому проверка x == 0 должна быть раньше правила про x % 9 == 0.

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

Есть число 987654. Кристалл заменяет число на сумму его цифр, и так делает снова и снова, пока не останется одна цифра. Давай руками прогоним именно этот пример и посмотрим, что происходит.

Идея: Можно честно «сжимать» число, пока не останется одна цифра. Если нужно быстро для очень больших чисел, полезно заметить, что при каждом сжатии сохраняется остаток при делении на 9, и по нему можно восстановить финальную цифру (а для нуля результат остаётся нулём).

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

Куда дальше