С, С ++, 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
и запутаться с приоритетом оператора. версия функции не имеет этой проблемы