← Все вопросы

Задание 25 ЕГЭ: как искать числа с нужным количеством делителей перебором?

Задан 5 дней назад690 просмотров4 ответа
14

В 25-м часто просят: найти в диапазоне числа, у которых ровно N делителей, или у которых наибольший делитель (кроме самого числа) обладает свойством. Перебор делителей до самого числа жутко медленный на больших диапазонах. Как ускорить и не упереться в тайм-лимит?

4 ответа

16
✓ Принятый ответ — помог автору

Перебирай делители только до корня числа — для каждого найденного делителя d сразу учитывай парный n//d. Это ускоряет в десятки раз и в тайм-лимит укладывается легко.

def divisors(n):
    res = []
    i = 1
    while i * i <= n:
        if n % i == 0:
            res.append(i)
            if i != n // i:
                res.append(n // i)
        i += 1
    return sorted(res)

for n in range(174000, 200000):
    d = divisors(n)
    if len(d) == 6:          # ровно 6 делителей — условие из задачи
        print(n, d[-2])      # например, второй по величине делитель

Ходишь while i*i <= n вместо range(1, n) — вот и весь секрет скорости. Для «наибольшего делителя кроме самого числа» это n // (наименьший простой делитель).

Станислав Скибицкий автор: укладывается мгновенно теперь · 3 дня назад
Жанна Осипова до корня + парный делитель = огонь, спасибо 🙏 · 3 дня назад
8

Перебор делителей только до √n, парный добавляешь как n//i. range(1,n) — это и есть твой тайм-лимит.

3

До корня квадратного.

-2

Бери sympy.divisors, чего велосипед изобретать.

Константин Ермаков на станции ЕГЭ sympy может не быть, лучше уметь руками · 3 дня назад

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект