С, С ++, 46 40 37 байт (#define), 50 47 46 байт (функция)
-1 байт благодаря Zacharý
-11 байт, благодаря потолку
Макро версия:
#define F(n)n*n*~n*~n/4+n*~n*(n-~n)/6
Версия функции:
int f(int n){return~n*n*n*~n/4+n*~n*(n-~n)/6;}
Эти строки основаны на 2 формулах:
Сумма чисел от 1 до n = n*(n+1)/2
Сумма квадратов от 1 до n =n*(n+1)*(2n+1)/6
Таким образом, формула, чтобы получить ответ просто (n*(n+1)/2) * (n*(n+1)/2) - n*(n+1)*(2n+1)/6
И теперь, чтобы «оптимизировать» количество байтов, мы разбиваем круглые скобки и перемещаем вещи, в то время как тестирование всегда дает один и тот же результат
(n*(n+1)/2) * (n*(n+1)/2) - n*(n+1)*(2n+1)/6=>
n*(n+1)/2*n*(n+1)/2 - n*(n+1)*(2n+1)/6=>
n*(n+1)*n*(n+1)/4 - n*(n+1)*(2n+1)/6
Обратите внимание на шаблон p = n*n+1 = n*n+n, поэтому в функции мы объявляем другую переменную, int p = n*n+nи она дает:
p*p/4 - p*(2n+1)/6
Ибо p*(p/4-(2*n+1)/6)и так n*(n+1)*(n*(n+1)/4 - (2n+1)/6), это работает только половину времени, и я подозреваю, что причиной является целочисленное деление (f(3) даем 24 вместо 22, f(24)даем 85200 вместо 85100, поэтому мы не можем разложить формулу макроса таким образом, даже если математически это то же самое.
И макро, и версия функции находятся здесь из-за замены макроса:
F (3) дает 3*3*(3+1)*(3+1)/4-3*(3+1)*(2*3+1)/6 = 22
F (5-2) дает5-2*5-2*(5-2+1)*(5-2+1)/4-5-2*(5-2+1)*(2*5-2+1)/6 = -30
и запутаться с приоритетом оператора. версия функции не имеет этой проблемы