Мне нужно оптимизировать этот код

a,l = map(int,input().split())

count = 0
for i in range(1,a):
    for j in range(1,a):
        for k in range(1,a):
            if a>=i+j+k and l>=i*j*k:
                count+=1

print(count)

Задача:
Сколько существует троек положительных целых чисел a, b, c
таких, что a+b+c <= S и a*b*c <= P?

Вводятся числа S P.
Пример если числа S=5 и P=2, то результат 4.
(Все подходящие тройки (1,1,1), (1,1,2), (1,2,1), (2,1,1).)


Ответы (2 шт):

Автор решения: GrAnd

А зачем там вообще if, если можно сразу циклы ограничить так, чтобы условие выполнялось всегда.

S, P = map(int,input().split())

count = 0
for a in range(1, min(S-2, P)+1):
    for b in range(1, min(S-1-a, P//a)+1):
        for c in range(1, min(S-a-b, P//(a*b))+1):
#            print(a,b,c)
            count+=1

print(count)

И даже в этом случае последний цикл точно не нужен:

for a in range(1, min(S-2, P)+1):
    for b in range(1, min(S-1-a, P//a)+1):
        count += min(S-a-b, P//(a*b))

Или даже так:

count = sum(min(S-a-b, P//(a*b)) for a in range(1, min(S-2, P)+1) for b in range(1, min(S-1-a, P//a)+1))

Последний вариант вычисляет результат за 5 секунд для S=5000 и P=1012 (где-то видел, что это граничные условия для данной задачи) : count = 20_820_835_000.

→ Ссылка
Автор решения: Богдан Петров
t=[]
for i in range(10):
    a=random.randint(-10,5)
    t.append(a)
print(t)
→ Ссылка