Найдите все натуральные числа, принадлежащие отрезку [20 000 000;25 000 000], у которых ровно пять различных нечётных делителей. Общее количество делителей может быть любым. В ответе перечислите найденные числа через пробел в порядке возрастания.
По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители. То есть некоторое натуральное число можно разложить в следующий вид:
Здесь – некоторое простое число, а
– натуральный показатель степени. В таком случае число обязательно имеет
делителей (каждое простое число можно брать от 0 до
раз, где
).
В данной задаче необходимо, чтобы у числа было ровно 5 нечётных делителей. Значит, число должно содержать в разложении некоторое простое нечётное число.
Пусть число имеет следующий вид (отдельно выпишем простое число 2 в разложении):
Выпишем количество нечётных делителей числа:
Это количество должно быть равно 5 – простому числу, а значит в этом произведении только 1 множитель, равный числу 5. Поэтому число должно иметь следующий вид:
Здесь показатель степени k может быть любым неотрицательным числом, так как степень числа 2 не влияет на количество нечётных делителей.
Таким образом, нужно будет перебрать простые числа p (исключая 2) так, чтобы получить все возможные числа вида из отрезка
.
def is_prime(n): # Функция проверки, является ли число простым
if n == 1: # Единицу нужно проверить отдельно
return False # 1 - не простое число, возвращаем False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0: # Если нашли нетривиальный делитель
return False # То число не простое, возвращаем False
return True
# Нужно перебрать все числа вида x = 2**k * p**4, где p - простое число
r = 25_000_000 # Левая граница отрезка
r = int(r ** (1 / 4)) # Извлечём корень 4 степени, чтобы получить максимальное возможное p
# Перебираем числа от l до r включительно
ans = [] # Список чисел для ответа
for p in range(3, r + 1): # Перебираем возможные простые числа
if is_prime(p): # Если число p - простое
# Пока число не выйдет за верхнюю границу отрезка,
# будем проверять его и увеличивать степень числа 2
num = p ** 4
while num <= 25_000_000:
if 20_000_000 <= num <= 25_000_000:
ans.append(num)
num *= 2 # Увеличиваем степень числа 2
print(*sorted(ans)) # Выводим элементы сортированного списка через пробел