Проект Эйлера. Задача 28 «Диагонали числовой спирали»

Условие:

Если начать с числа 1 и двигаться дальше вправо по часовой стрелке, образуется следующая спираль 5х5:

21 22 23 24 25
20  7  8  9 10
19  6  1  2 11
18  5  4  3 12
17 16 15 14 13

Можно убедиться, что сумма чисел в диагоналях равна 101.

Какова сумма чисел в диагоналях спирали 1001 на 1001, образованной таким же способом?

Решение:

# Мы имеем n * n квадрат, где n - нечетное.
# Правый верхний угол равен n * n
# Если идти против часовой стрелки, то верхний левый угол равен n^2 - (n - 1).
# Нижний левый угол равен n^2 - 2(n - 1) и нижний правый равен n^2 - 3(n-1)
# Собрав все это, сумму на внешнем кольце можно выразить формулой 4n^2 - 6(n - 1).
# 
# Между прочим , общая формула для такой задачи(4m^3 + 3m^2 + 8m - 9) / 6, где m - это размер спирали. В нашем случае это 1001

def compute():
	SIZE = 1001  # Must be odd
	ans = 1  # Special case for size 1
	ans += sum(4 * i * i - 6 * (i - 1) for i in range(3, SIZE + 1, 2))
	return str(ans)


if __name__ == "__main__":
	print(compute())

Прокрутить вверх