Условие: № 6210 (Уровень: Средний)
• Статья подготовлена командой itpy
• Полный разбор задачи в Notion
(Н. Сафронов) Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
— символ «?» означает ровно одну произвольную цифру;
— символ «» означает любую последовательность цифр произвольной длины; в том числе «» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300425.
Найдите все натуральные числа, не превосходящие 10**7, для которых выполняются одновременно все условия:
- соответствуют маске *2?2*;
- являются палиндромами;
- делятся на число 53 без остатка;
- количество делителей больше 30.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — сумму делителей.
Решение через Python и комментарии к нему:
Комментарии к коду решения:
- from fnmatch import * - Импортируем все функции из модуля fnmatch для использования функции fnmatch.
- def divisors(num): - Определяем функцию divisors с аргументом num для поиска делителей числа.
- div = [] - Инициализируем пустой список div для хранения делителей.
- for j in range(1, int(num**0.5)+1): - Запускаем итерацию по значениям от 1 до квадратного корня числа num (такой подход помогает быстро найти все сомножители делителей).
- if num % j == 0: - Проверяем является ли j делителем числа num.
- div.append(j) - После чего добавляем j в список делителей div.
- div.append(num // j) - Так же добавляем num // j (сомножитель j) в список делителей.
- return sorted(set(div)) - Возвращаем отсортированное множество уникальных делителей (если у числа есть целый квадратный корень, то могут появится копии делителя).
- for x in range(53, 10**7, 53): - После определения функции нужно запустить итерацию по значениям x от 53 до 10**7 с шагом 53, чтобы получить все числа делящиеся на 53.
- if fnmatch(str(x), '*2?2*'): - Проверяем, соответствует ли строковое представление числа x нашей маске 2?2.
- if str(x) == str(x)[::-1]: - Так может выглядеть простая проверка на палиндромом.
- d = divisors(x) - Вызываем нашу функцию divisors для определения делителей числа x.
- if len(d) > 30: - Проверяем кол-во делителей числа x (по условию больше 30).
- print(x, sum(d)) - Вывод все подходящие числа x и суммы его делителей.
Ответ:
212212 508032
2527252 5588352
4282824 13789440
4626264 11787120
8125218 19595520
8824288 19908504