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