""" The sum of the squares of the first ten natural numbers is 1^2 + 2^2 + ... + 10^2 = 385, The square of the sum of the first ten natural numbers is (1+2+...+10)^2 = 55^2 = 3025, Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 - 385 = 2640. Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum. """ import time import numpy as np def timer(func): def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f"{func.__name__} took {end - start:.6f} seconds") return result return wrapper @timer def sum_square_difference(n: int) -> int: res = 0 for i in range(1, n + 1): res += sum(np.array(list(range(1, i))) * i) return 2 * res @timer def better_sum_square(n: int) -> int: """https://en.wikipedia.org/wiki/Faulhaber%27s_formula""" su = ((1 + n) * n // 2) ** 2 sq = (2 * n + 1) * (n + 1) * n // 6 return su - sq if __name__ == "__main__": print(sum_square_difference(100)) print(better_sum_square(100))