Problem 28

Problem 28

数式の書き方としてあってるかどうか分かりませんが・・・・
解き方としてはこんな感じかな??

\{\Bigsum_{x=\1}^{n}4(2x+1)^2-12x\}+1
範囲は1001x1001なので
n{\leq}1001^2ではなくn{\leq}500となるみたい。
つまり
\{\Bigsum_{x=\1}^{n{\leq}500}4(2x+1)^2-12x\}+1

右上の数字は奇数値に対して+2ずつした数の二乗した数になるので、それを逆算をして2で割ることで何回回れば一辺が1001の螺旋数列になるかが求まる。
(1001-1)/2=500となる。
よってn{\leq}500となる。

あるサイトに数式があったので、tex形式で貼り付けておきます。
\{\Bigsum_{x=\1}^{(n-1)/2}4(2x+1)^2-12x\}+1\;=\;\frac{4n^3+3n^2+8n-9}{6}

■コード

module Problem_0028

(*
1から初めて右方向に進み時計回りに数字を増やしていき, 5×5の螺旋が以下のように生成される:
21	22	23	24	25
20	7	8	9	10
19	6	1	2	11
18	5	4	3	12
17	16	15	14	13
両対角線上の数字の合計は101であることが確かめられる.
1001×1001の螺旋を同じ方法で生成したとき, 対角線上の数字の合計はいくつだろうか?
*)

// 1 3 5 7 9 13 17 21 24 .. 1001^2 まで足し込む
// maxは1以上の奇数でなければならない。
// 669171001 57ms
let calc max =
    let max = max * max
    Seq.initInfinite ((+)1)
    |> Seq.takeWhile ((>=)500)
    |> Seq.map(fun x -> 4*((2*x+1)*(2*x+1)) - (x*12))
    |> Seq.sum
    |> ((+)1)

let run () =
    calc 1001