C, C ++, 46 40 37 bajtów (# zdefiniować), 50 47 46 bajtów (funkcja)
-1 bajt dzięki Zacharý
-11 bajtów dzięki pułapkowi cat
Wersja makro:
#define F(n)n*n*~n*~n/4+n*~n*(n-~n)/6
Wersja funkcji:
int f(int n){return~n*n*n*~n/4+n*~n*(n-~n)/6;}
Te linie oparte są na tych 2 formułach:
Suma liczb od 1 do n = n*(n+1)/2
Suma kwadratów od 1 do n =n*(n+1)*(2n+1)/6
Tak więc formuła uzyskania odpowiedzi jest prosta (n*(n+1)/2) * (n*(n+1)/2) - n*(n+1)*(2n+1)/6
A teraz, aby „zoptymalizować” liczbę bajtów, przerywamy nawiasy i przesuwamy różne elementy, a testowanie zawsze daje ten sam wynik
(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
Zwróć uwagę na wzorzec p = n*n+1 = n*n+n, dlatego w funkcji deklarujemy inną zmienną, int p = n*n+nktóra daje:
p*p/4 - p*(2n+1)/6
Do p*(p/4-(2*n+1)/6)i tak n*(n+1)*(n*(n+1)/4 - (2n+1)/6), to działa połowę czasu tylko i podejrzewam podział całkowitą być przyczyną ( f(3)co daje 24 zamiast 22, f(24)co daje 85200 zamiast 85100, więc nie możemy rozkładać na czynniki formuła makro w ten sposób, nawet jeśli matematycznie jest to samo.
Zarówno wersja makra, jak i wersja są dostępne z powodu podstawienia makra:
F (3) daje 3*3*(3+1)*(3+1)/4-3*(3+1)*(2*3+1)/6 = 22
F (5-2) daje5-2*5-2*(5-2+1)*(5-2+1)/4-5-2*(5-2+1)*(2*5-2+1)/6 = -30
i zepsuć pierwszeństwo operatora. wersja funkcji nie ma tego problemu