Задача к ЕГЭ по информатике на тему «делители числа» №2

Найдите все натуральные числа, принадлежащие отрезку [101 000 000; 102 000 000], у которых ровно три различных чётных делителя. Общее количество делителей может быть любым. В ответе перечислите найденные числа через пробел в порядке возрастания.

По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители. То есть некоторое натуральное число x  можно разложить в следующий вид:

x = p1q1 ⋅p2q2 ⋅...⋅pnqn

Здесь pi,i ∈ [1;n]  – некоторое простое число, а qi,i ∈ [1;n]  – натуральный показатель степени. В таком случае число обязательно имеет (q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1)  делителей (каждое простое число можно брать от 0 до qi  раз, где i ∈ [1;n]  ).

В данной задаче необходимо, чтобы у числа было ровно 3 чётных делителя. Значит в разложении числа должно участвовать простое число 2.

Пусть число имеет следующий вид:

x = 2k ⋅p1q1 ⋅...⋅pnqn

Выпишем количество делителей числа:

(k+ 1)⋅(q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1)

Выпишем количество делителей числа, не содержащих степень числа 2, то есть не являющихся чётными:

(q1 + 1)⋅(q2 + 1)⋅...⋅(qn + 1)

Из общего количества делителей вычтем количество делителей, не являющихся чётными, и получим количество чётных делителей:

k ⋅(q1 +1) ⋅(q2 + 1)⋅...⋅(qn + 1)

Обозначим произведение всех qi  за m  . Так как количество по условию должно быть равно 3, то k⋅m = 3  . Так как число 3 – простое, то либо k = 3  и m = 1  , либо k = 1  и m = 3  .

В первом случае это число 23  , так как m = 1  означает, что других простых чисел в разложении числа нет.

Во втором случае произведение всех qi  равно 3, а значит только 1 множитель должен быть равен 3. Поэтому число будет иметь вид 21 ⋅p2  .

В общем случае это можно представить, как    2 2⋅p ,  где p  – любое простое число (включая число 2, что обобщает эти два случая).

Таким образом, нужно будет перебрать простые числа так, чтобы получить все возможные числа вида 2 ⋅p2  из отрезка [101000000;102000000]  .

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 * p**2, где p - простое число

l = 101_000_000  # Левая граница отрезка
# Делим на 2, а затем извлекаем корень 2 степени,
# чтобы получить первое возможное p
l = int((l / 2) ** (1 / 2))

# Аналогично с правой границей отрезка
r = 102_000_000
r = int((r / 2) ** (1 / 2))

# Перебираем числа от l до r включительно
ans = []  # Список чисел для ответа
for p in range(l, r + 1):
    if is_prime(p):  # Если число p - простое
        # Проверяем, что итоговое число будет принадлежать отрезку
        if 101_000_000 <= 2 * p ** 2 <= 102_000_000:
            ans.append(2 * p ** 2)

print(*ans)  # Выводим элементы списка через пробел

Ответ: 101075762 101417282 101588258 101645282
Оцените статью
Я решу все!