Теория
Что нужно знать
Задание 25 — это программирование, а не ручной счёт. Нужно перебрать числа на отрезке или кандидатов по маске, разложить число на множители, посчитать делители и выбрать те, что удовлетворяют условию. В базе Kompege по теме 1 075 задач, 124 решения (119 программных и 5 текстовых) и 241 видеоразбор (144 YouTube, 63 VK, 34 Rutube). Около 490 формулировок связаны с делителями, 462 — с масками, а 102 задачи совмещают оба условия.
Число и его делители
Делитель натурального числа N — такое натуральное d, при котором N делится на d без остатка. У каждого делителя есть пара N/d, поэтому все делители удобно искать до √N: если d ≤ √N делит N, то N/d — второй делитель пары. Единица и само N тоже являются делителями, но во многих формулировках их просят не учитывать.
- Если d делит N, то и N // d делит N: делители идут парами.
- При переборе d от 2 до isqrt(N) добавляйте оба числа: d и N // d.
- Если d = N // d, делитель один: это полный квадрат, не добавляйте его дважды.
- «Нетривиальные» делители — все, кроме 1 и N; «собственные» — все, кроме N.
- Простые числа имеют ровно два делителя: 1 и само число.
- Ноль не является делителем натурального числа.
d | N ⇔ N % d == 0N = d · (N // d)d ≤ √N ⇔ N // d ≥ √N
Простые числа и разложение
Простое число делится только на 1 и на себя. Единица не является ни простой, ни составной. Любое N > 1 единственным образом раскладывается на простые множители: N = p1^a1 · p2^a2 · … · pk^ak. Это разложение — ключ к задачам, где делители нельзя перечислить вручную.
- Проверка простоты — перебор d от 2 до isqrt(N); найденный делитель означает составное число.
- 2 — единственное чётное простое; после проверки 2 можно идти только по нечётным d.
- Для разложения делите N на p, пока оно делится; так в словаре останутся степени.
- «Различные простые делители» — ключи разложения; с кратностью — с повторами.
- Для сотен тысяч чисел решето Эратосфена быстрее проверки каждого числа отдельно.
- Оставшееся число больше 1 после trial division — простое, его тоже нужно добавить.
N = p1^a1 · p2^a2 · … · pk^akпростое число: ровно 2 делителя1 — не простое и не составное
Сколько делителей у числа
Если N = p1^a1 · p2^a2 · … · pk^ak, то количество всех натуральных делителей τ(N) = (a1+1)(a2+1)…(ak+1). Множитель (ai+1) — число способов выбрать степень pi от 0 до ai. Формула незаменима, когда N огромно или когда известно только разложение.
- τ(360) = τ(2^3 · 3^2 · 5) = 4 · 3 · 2 = 24.
- Количество нетривиальных делителей = τ(N) − 2.
- τ(N) нечётно тогда и только тогда, когда N — полный квадрат.
- Если N = 2^a · m и m нечётно, чётных делителей ровно a · τ(m), нечётных — τ(m).
- Ровно три чётных делителя, считая само N: N = 8 или N = 2p².
- Если N не считать, ровно три чётных делителя дают N = 16, 4p, 2p³ или 2pq (p и q — различные нечётные простые).
- Ровно пять различных нечётных делителей: нечётная часть N имеет вид p⁴.
τ(N) = (a1+1)(a2+1)…(ak+1)чётных делителей: a · τ(m), где N = 2^a · mнечётных делителей: τ(m)τ(N) нечётно ⇔ N — полный квадрат
Сумма делителей
Сумма всех делителей σ(N) также выражается через разложение: σ(N) = ∏ (p^(a+1) − 1)/(p − 1). Чтобы получить сумму без 1 и самого N, вычтите 1 и N. Для суммы только простых делителей используйте ключи разложения, а не все делители.
- σ(360) = 15 · 13 · 6 = 1170; сумма без 1 и 360 равна 809.
- Сумма простых делителей без кратности — сумма ключей разложения.
- Сумма простых делителей с кратностью — сумма p · a по всем p.
- Если N = 2^a · m, сумма чётных делителей равна (2 + 4 + … + 2^a) · σ(m).
- Сумма нечётных делителей — это σ(m), где m — нечётная часть N.
- σ(N) нечётна тогда и только тогда, когда N — квадрат или удвоенный квадрат.
σ(N) = ∏ (p^(a+1) − 1)/(p − 1)сумма без 1 и N: σ(N) − 1 − Nσ(N) нечётна ⇔ N = t² или N = 2t²
Парные делители и позиции
Делители идут парами d и N/d. Поэтому наименьший нетривиальный делитель — первый найденный d > 1, а наибольший собственный делитель — N / d_min для составного N. Пятый по величине делитель — это N, делённое на пятый по возрастанию нетривиальный делитель.
- Наибольший делитель, не равный N, равен N // d_min, где d_min — наименьший простой делитель.
- k-й по величине нетривиальный делитель = N // (k-й по возрастанию нетривиальный).
- Минимальный и максимальный нетривиальные делители: d_min и N // d_min.
- Сумма пары равна d + N/d; пара ближе к √N, когда d ближе к корню.
- «Пятый по величине» проще искать, собрав и отсортировав делители; при огромном N — через пять наименьших.
- Для простого числа нетривиальных делителей нет, поэтому M(N) = 0 по условию.
d · (N // d) = Nmax_proper = N // min_divisor_>1k-й_max = N // (k-й_min)
Чётность и особые свойства
Многие условия читаются через строение числа, а не через полный перебор. Чётность количества делителей, нечётность суммы, произведение делителей и точное число делителей — всё это признаки, которые проверяются по разложению.
- Все делители нечётны тогда и только тогда, когда N нечётно.
- Сумма всех делителей нечётна тогда и только тогда, когда N — квадрат или удвоенный квадрат.
- Произведение всех делителей равно N^(τ(N)/2); для полного квадрата это (√N)^τ(N).
- Если сумма и произведение делителей нечётны, N — нечётный квадрат.
- Ровно 4 делителя: N = p³ или N = p · q (p ≠ q).
- Ровно 6 делителей: N = p⁵ или N = p² · q.
- Ровно 9 делителей: N = p⁸ или N = p² · q².
τ = 4: p³ или p · qτ = 6: p⁵ или p² · qτ = 9: p⁸ или p² · q²произведение делителей = N^(τ/2)
Цифры, окончания и остатки
В задании 25 часто комбинируют делители с десятичной записью: делитель оканчивается на 7, сумма цифр кратна 14, число является палиндромом. Сначала выделите дешёвое цифровое условие, затем проверяйте делители.
- Последняя цифра: n % 10; две последние: n % 100; три последние: n % 1000.
- Сумма цифр: sum(map(int, str(n))); произведение считайте отдельно, ноль — особый случай.
- Палиндром: s == s[::-1].
- «Делитель оканчивается на d» — это d % 10 == digit, а не N % 10.
- «Делитель двузначный» — 10 ≤ d ≤ 99; «трёхзначный» — 100 ≤ d ≤ 999.
- Остаток от деления суммы делителей: сначала сумма, затем % m.
last = n % 10digits = [int(c) for c in str(n)]palindrome: s == s[::-1]
Маски «?» и «*»
Маска — это строка из цифр и символов «?» и «*». «?» заменяет ровно одну цифру, «*» — любую последовательность цифр, в том числе пустую. В Python маску проверяет fnmatch.fnmatchcase. Маска задаёт не число, а его десятичную запись, поэтому важна длина и то, что у числа нет ведущих нулей.
- fnmatchcase(str(x), '12*4?5') истинно, если вся запись x подходит под маску.
- «*» может соответствовать пустой строке; «?» — ровно один символ.
- Если маска начинается с «?», первая цифра числа всё равно не может быть нулём.
- Для делимости на m перебирайте не все числа, а кратные: range(m, limit + 1, m).
- Маска без «*» задаёт точную длину; с «*» длина переменная.
- fnmatch трактует квадратные скобки как класс символов; в экзаменационных масках их нет.
from fnmatch import fnmatchcaserange(m, limit + 1, m)«?» = 1 цифра, «*» = 0 или больше цифр
Стратегия и сложность
Главная ошибка — перебирать слишком широкий диапазон с полной проверкой делителей. Сначала оцените количество чисел и стоимость проверки. Если чисел несколько тысяч, прямой перебор с √N обычно успевает; если чисел 10⁵ и больше, даже проверка до корня может занять минуты — ищите строение числа, маску или кратные.
- Стоимость прямой проверки: длина диапазона × √N. Для 10⁵ чисел около 10⁹ операций — уже медленно.
- Для 10⁷–10⁸ чисел используйте решето или проверяйте только кратных и кандидатов.
- math.isqrt(N) точнее и быстрее, чем int(N ** 0.5) на больших числах.
- Проверяйте дешёвые условия (маска, последняя цифра, чётность) раньше перебора делителей.
- При «первых N» ставьте break сразу после N-го найденного; при «последних N» идите вниз.
- Если ответ не находится, увеличивайте лимит постепенно и проверяйте границы.
O(len · √N) — прямой переборрешето: O(n log log n), память O(n)isqrt(N) вместо N ** 0.5
Формат ответа
В задании 25 ответ — не одно число, а таблица пар или несколько значений. Формулировка всегда уточняет порядок: по возрастанию числа, по возрастанию делителей, сначала N, затем делитель или наоборот. Перечитайте её перед записью.
- «Запишите само число и …» — сначала N; «справа от числа» — N, затем значение.
- «Два наибольших делителя в порядке возрастания» — меньший, затем больший.
- «В порядке убывания» — начинайте с большего и не сортируйте по возрастанию по привычке.
- «Частное от деления» — это x // d, а не сам делитель.
- «Количество подходящих чисел» — одно число, а не список.
- Границы: [a; b] включает b; «больше a» начинается с a+1; «меньше b» заканчивается b−1.
- Лишние строки таблицы в бланке не заполняйте.
[a; b] → range(a, b + 1)x > a → range(a + 1, …)x < b → range(…, b)