Мне нужно оптимизировать этот код
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)