C, C ++, 46 40 37 bytes (#define), 50 47 46 bytes (função)
-1 byte graças a Zacharý
-11 bytes graças ao ceilingcat
Versão macro:
#define F(n)n*n*~n*~n/4+n*~n*(n-~n)/6
Versão da função:
int f(int n){return~n*n*n*~n/4+n*~n*(n-~n)/6;}
Essas linhas são baseadas nessas 2 fórmulas:
Soma dos números entre 1 e n = n*(n+1)/2
Soma dos quadrados entre 1 e n =n*(n+1)*(2n+1)/6
Portanto, a fórmula para obter a resposta é simplesmente (n*(n+1)/2) * (n*(n+1)/2) - n*(n+1)*(2n+1)/6
E agora, para "otimizar" a contagem de bytes, quebramos os parênteses e movemos as coisas, enquanto o teste sempre dá o mesmo 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 o padrão p = n*n+1 = n*n+n
, portanto, na função, declaramos outra variável int p = n*n+n
e ela fornece:
p*p/4 - p*(2n+1)/6
Por p*(p/4-(2*n+1)/6)
isso n*(n+1)*(n*(n+1)/4 - (2n+1)/6)
, funciona apenas na metade do tempo, e suspeito que a divisão inteira seja a causa ( f(3)
dando 24 em vez de 22, f(24)
dando 85200 em vez de 85100, por isso não podemos fatorar a fórmula da macro dessa maneira, mesmo que matematicamente seja o mesmo.
Tanto a macro quanto a versão da função estão aqui devido à substituição da macro:
F (3) dá 3*3*(3+1)*(3+1)/4-3*(3+1)*(2*3+1)/6 = 22
F (5-2) dá5-2*5-2*(5-2+1)*(5-2+1)/4-5-2*(5-2+1)*(2*5-2+1)/6 = -30
e mexer com a precedência do operador. a versão da função não tem esse problema