№ 7724 (Уровень: Базовый)

(Грачев Н.) Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
«?» означает ровно одну произвольную цифру;«*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Найдите все натуральные числа, не превосходящие 109, для которых выполнены все условия:
*18??18;В ответе запишите в первом столбце таблицы первые пять найденных чисел в порядке возрастания, справа от каждого числа кол-во его делителей.
.png)
from fnmatch import * - импортируем все функции из библиотеки fnmatch, который предоставляет возможность сравнивать строки с шаблонами.for x in range(1018, 10**9, 1018): - начинаем цикл, перебирая значения x в диапазоне от 1018 до 10**9 с шагом 1018 (таким образом мы сразу ищем числа, которые делятся на 1018 без остатка см. условие).if fnmatch(str(x), '*18??18'): - проверяем, если строковое представление x соответствует шаблону '*18??18' с помощью функции fnmatch.if x % 18 == 0: - проверяем, если x делится на 18 без остатка.divisors = set() - создаем пустое множество для хранения делителей.for j in range(1, int(x**0.5)+1): - начинаем цикл, перебирая значения j от 1 до корня из x плюс 1 (int(x**0.5)+1 помогает нам искать пары чисел, используя корни чисел, так же это оптимизирует работу алгоритма).