考え方2
ちょっと面白くないので別解を考えてみる
(a+b+c+d)2=a2+b2+c2+d2+a(b+c+d)+b(a+c+d)+c(a+b+d)+d(a+b+c)
=a2+b2+c2+d2+2(ab+ac+ad+bc+bd+cd)
=a2+b2+c2+d2+2(a(b+c+d)+b(c+d)+c(d))
つまり
(a+b+c+d)2−(a2+b2+c2+d2)=2(a(b+c+d)+b(c+d)+c(d))
具体的な数値を与えてみる
(1+2+3+4)2=2(1(2+3+4)+2(3+4)+3(4))
x * [x+1..4]の和 (x: 1~4)を2倍しているように見えてくる
畳込みで表してみよう
2 * foldl (\acc x -> acc + (x * sum [x+1..100])) 0 [1..100]
毎回リストを走査するのがもったいない?
2 * fst $ foldl (\(ans, total) x -> (ans + x * total, total + x)) (0, 0) [100,99..0]