kondrackii
@kondrackii
1 + 1 = 11

Как уменьшить время выполнения программы?

Здравствуйте, решаю пробный тур олимпиады по программированию. Отправляю решение задачи на проверку, смотрю, а система проверила и дала половину баллов из-за "Превышено ограничение по времени".
скрины проверки

5de215a78901b099442267.png
5de215bf5743f968262900.png

код

n = int(input())
 
max_dividers = 0
number_of_max_dividers = 0
for i in range(1, n + 1):
    dividers = 0
    for j in range(1, i + 1):
        if i % j == 0:
            dividers += 1
 
    if dividers > max_dividers:
        max_dividers = dividers
        number_of_max_dividers = i
 
print(number_of_max_dividers)
print(max_dividers)


и на всякий случай
условия задачи

5de21618a486a497576662.png

заранее спасибо.
  • Вопрос задан
  • 310 просмотров
Решения вопроса 1
adugin
@adugin Куратор тега Python
Модифицированное решето Эратосфена:
import numpy as np
from numba import njit

# С использованием numpy
def max_divisors_v1(n):
    divs = np.ones(n + 1, np.uint8)
    for step in range(2, n + 1):
        divs[step::step] += 1
    divs[0] = 0
    num = divs.argmax()
    return num, divs[num]

# Без numpy, чистый Python
def max_divisors_v2(n):
    divs = [1] * (n + 1)
    for step in range(2, n + 1):
        for index in range(step, n + 1, step):
            divs[index] += 1
    divs[0] = 0
    cnt = max(divs)
    num = divs.index(cnt)
    return num, cnt

# JIT-компиляция с декоратором @njit
max_divisors_v3 = njit(max_divisors_v2)

Вывод результата и тайминги выполнения:
5de3a58791b15017261449.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы