C, C ++, 46 40 37 bytes (#definir), 50 47 46 bytes (función)
-1 byte gracias a Zacharý
-11 bytes gracias a ceilingcat
Versión macro:
#define F(n)n*n*~n*~n/4+n*~n*(n-~n)/6
Versión de la función:
int f(int n){return~n*n*n*~n/4+n*~n*(n-~n)/6;}
Estas líneas se basan en esas 2 fórmulas:
Suma de números entre 1 yn = n*(n+1)/2
Suma de cuadrados entre 1 y n =n*(n+1)*(2n+1)/6
Entonces la fórmula para obtener la respuesta es simplemente (n*(n+1)/2) * (n*(n+1)/2) - n*(n+1)*(2n+1)/6
Y ahora para "optimizar" el recuento de bytes, separamos los paréntesis y movemos las cosas, mientras que las pruebas siempre dan el mismo resultado
(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
Observe el patrón p = n*n+1 = n*n+n
, por lo que en la función, declaramos otra variable int p = n*n+n
y da:
p*p/4 - p*(2n+1)/6
Por p*(p/4-(2*n+1)/6)
lo tanto n*(n+1)*(n*(n+1)/4 - (2n+1)/6)
, funciona solo la mitad del tiempo, y sospecho que la división entera es la causa ( f(3)
dando 24 en lugar de 22,f(24)
dando 85200 en lugar de 85100, por lo que no podemos factorizar la fórmula de la macro de esa manera, incluso si matemáticamente es lo mismo.
Tanto la versión macro como la función están aquí debido a la sustitución macro:
F (3) da 3*3*(3+1)*(3+1)/4-3*(3+1)*(2*3+1)/6 = 22
F (5-2) da5-2*5-2*(5-2+1)*(5-2+1)/4-5-2*(5-2+1)*(2*5-2+1)/6 = -30
y estropear la precedencia del operador la versión de la función no tiene este problema