(М. Фирсов) Простой палиндром – это число, которое читается одинаково слева направо и справа налево, и при этом является простым, то есть не имеет делителей, кроме \(1\) и самого себя. Примеры простых палиндромов – \(101,\) \(131,\) \(151\) и т.д. Все простые палиндромы на отрезке \([100;~1~000~000~000]\) распределили по группам с одинаковыми произведениями цифр (если в числе есть цифра \(0,\) она не учитывается в произведении: для числа \(16061\) произведением цифр будет \(36).\) Найдите \(5\) самых больших по значению чисел в группе с наибольшим количеством элементов. Расположите эти числа в порядке возрастания.
Решение:
Python
from collections import defaultdict
from math import isqrt
def is_prime(n: int) -> bool:
if n == 2:
return True
if n & 1 == 0:
return False
for x in range(3, isqrt(n) + 1):
if n % x == 0:
return False
return True
palindroms = []
# Генерируем палиндромы чётной длины и проверяем их на простоту
# Также учитываем, что простые числа не могут оканчиваться на чётные цифры и 5
for t in range(10, 10_000):
st = str(t)
if st[0] in '24685':
continue
palindroms.append(st + st[::-1])
# Генерируем палиндромы нечётной длины и проверяем их на простоту
# Также учитываем, что простые числа не могут оканчиваться на чётные цифры и 5
for t in range(1, 10000):
st = str(t)
if st[0] in '24685':
continue
for c in '0123456789':
palindroms.append(st + c + st[::-1])
pal_gr = defaultdict(list)
for pal in palindroms:
if is_prime(int(pal)):
p = 1
for z in pal:
if z != '0':
p *= int(z)
pal_gr[p].append(int(pal))
max_q = max([len(pal_gr[g]) for g in pal_gr])
ans = [pal_gr[g] for g in pal_gr if len(pal_gr[g]) == max_q][0]
for a in ans[-5:]:
print(a)
Ответ:
\(923040329\)
\(926000629\)
\(932141239\)
\(934101439\)
\(961212169\)
Эффективно готовьтесь к ЕГЭ по информатике с новым тренажёром, эмулирующем работу станции КЕГЭ, которая используется на реальном экзамене