Задача #1356
Делители и маски
(С. Чайкин) Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
– символ «?» означает ровно одну произвольную цифру;
– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 108, найдите 5 наибольших простых чисел, для которых $ соответствует маске 5*3?9*1.
В ответе запишите в первом столбце таблицы все найденные числа в порядке убывания, а во втором столбце – количество простых чисел, использованных в сумме.
Примечание: с помощью обозначим сумму всех простых чисел, не первышающих .
Решение
Ответ
from fnmatch import *# найдем все простые числа, не превышающие 10^8# для этого воспользуемся решетом Эратосфенаn = 10**8p = [0, 0, 1] + [x % 2 for x in range(3, n+1)]for d in range(3, int(n ** 0.5)+1):if p[d] != 0:for j in range(d*d, n+1, d):p[j] = 0# для каждого простого числа посчитаем сумму n$# применим префиксные суммы для этогоpr = [(0, 0, 0)]for i in range(1, n+1):if p[i]:pr += [(i, pr[-1][1] + i, pr[-1][2] + 1)]# разворачиваем наш список и выводим первые 5 подходящих чиселcount = 0for n, s, c in pr[::-1]:if fnmatch(str(s), '5*3?9*1'):print(n, c)count += 1# если кол-во чисел равно 5if count == 5:# выходим из циклаbreak