def sum_factorials(n, cache=[0, 1]):
if len(cache) > n:
return cache[n]
previous = sum_factorials(n - 1)
cache.append((previous - sum_factorials(n - 2)) * n + previous)
return cache[n]
def f(n, i=1, factorial=1, result=1):
if i == n:
return result
next = factorial * (i + 1)
return f(n, i + 1, next, result + next)
import time
start = time.time()
result = sum_factorials(980)
print(time.time() - start)
start = time.time()
result2 = f(980)
print(time.time() - start)
ZGVmIHN1bV9mYWN0b3JpYWxzKG4sIGNhY2hlPVswLCAxXSk6CiAgICBpZiBsZW4oY2FjaGUpID4gbjoKICAgICAgICByZXR1cm4gY2FjaGVbbl0KICAgIHByZXZpb3VzID0gc3VtX2ZhY3RvcmlhbHMobiAtIDEpCiAgICBjYWNoZS5hcHBlbmQoKHByZXZpb3VzIC0gc3VtX2ZhY3RvcmlhbHMobiAtIDIpKSAqIG4gKyBwcmV2aW91cykKICAgIHJldHVybiBjYWNoZVtuXQoKZGVmIGYobiwgaT0xLCBmYWN0b3JpYWw9MSwgcmVzdWx0PTEpOgogIGlmIGkgPT0gbjoKICAgIHJldHVybiByZXN1bHQKICBuZXh0ID0gZmFjdG9yaWFsICogKGkgKyAxKQogIHJldHVybiBmKG4sIGkgKyAxLCBuZXh0LCByZXN1bHQgKyBuZXh0KQoKaW1wb3J0IHRpbWUKc3RhcnQgPSB0aW1lLnRpbWUoKQpyZXN1bHQgPSBzdW1fZmFjdG9yaWFscyg5ODApCnByaW50KHRpbWUudGltZSgpIC0gc3RhcnQpCgpzdGFydCA9IHRpbWUudGltZSgpCnJlc3VsdDIgPSBmKDk4MCkKcHJpbnQodGltZS50aW1lKCkgLSBzdGFydCk=