Сколько ключей к шкафчику
Условие
В школе завхоз выдал новый шкафчик с номером N и говорит: «К нему подходит ровно столько ключей, сколько у числа N положительных делителей».
Помоги быстро понять, сколько таких ключей нужно.
Важно: N может быть больше 2^31, как на олимпиадах (влезает в 64-битный тип).
Формат ввода
Одно целое число N.
Формат вывода
Выведите одно целое число — количество положительных делителей числа N.
Ограничения
- 1 ≤ N ≤ 10^12
- Время: 1 секунда, память: 256 МБ
Пример
Ввод:
12
Вывод:
6
Пояснение: делители 12 — это 1, 2, 3, 4, 6, 12.
Как решать — идея подхода
Приём: Перебор делителей до корня (парные делители)
Ключевое наблюдение: если d делит N, то вместе с ним существует парный делитель N//d. Один из них обязательно <= sqrt(N), второй >= sqrt(N). Значит, чтобы посчитать все делители, не нужно перебирать числа до N — хватает перебора до корня.
Почему это работает: делители «спариваются» вокруг sqrt(N). Для каждого найденного d мы сразу учитываем два делителя: d и N//d.
План решения:
- Прочитай
N(он до 1e12, в Python это без проблем). - Найди целый корень
r = isqrt(N)(без float, чтобы не поймать ошибки округления). - Иди
dот 1 доr: - если
N % d == 0, добавь к ответу 2 (заdиN//d):cnt += 2. - Если
r*r == N, значитsqrt(N)был посчитан дважды (пара совпала), вычти 1. - Выведи
cnt.
Сложность: O(sqrt(N)) проверок делимости; для N <= 1e12 это до 1e6 итераций — нормально за 1 секунду.
Частая ошибка: считать корень через int(N**0.5) и из-за погрешности пропустить случай, когда N — полный квадрат. Используй math.isqrt и отдельно обработай r*r == N.
Разберись руками
Номер шкафчика N = 12. Количество подходящих ключей равно количеству положительных делителей числа 12 (чисел, на которые 12 делится без остатка).
- Отметь на ленте числа от 1 до 12, которые являются делителями 12 (12 % x == 0).
- Заметь пары делителей: если 12 делится на d, то есть и парный делитель 12//d. Какие пары получаются у 12?
- Сколько всего делителей у 12? (Можно просто посчитать отмеченные числа или посчитать пары и удвоить.)
Идея: Найди все числа, которые делят N без остатка. Удобно замечать, что делители идут парами: маленький делитель и большой «парный» к нему; поэтому можно искать делители только среди маленьких и каждый найденный сразу даёт пару, а если вдруг пара совпала (когда число — точный квадрат), не считать её дважды.
Решить задачу с автопроверкой на Python →
Куда дальше
- Школьный этап ВсОШ по информатике — как устроен первый этап и план подготовки за четыре недели
- БВИ и льготы при поступлении — какой диплом что даёт и сколько лет он действует
- Перечневые олимпиады по информатике — олимпиады перечня Минобрнауки, их уровни и что нужно к диплому