C, C++, 46 40 37 bytes ( #define ), 50 47 46 bytes ( function )
-1 byte thanks to Zacharý
-11 bytes thanks to ceilingcat
Macro version :
#define F(n)n*n*~n*~n/4+n*~n*(n-~n)/6
Function version :
int f(int n){return~n*n*n*~n/4+n*~n*(n-~n)/6;}
Thoses lines are based on thoses 2 formulas :
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
pattern 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) gives 3*3*(3+1)*(3+1)/4-3*(3+1)*(2*3+1)/6 = 22
F(5-2) gives 5-2*5-2*(5-2+1)*(5-2+1)/4-5-2*(5-2+1)*(2*5-2+1)/6 = -30
and mess up with the operator precedence. the function version does not have this problem