http://projecteuler.net/index.php?section=problems&id=39
配列を使うと簡単。
open Seq // p = 2lm(m + n) let N = 1000 let count_peri = Array.create (N + 1) 0 for m in takeWhile (fun m -> 2 * m * (m + 1) <= N) (seq { 2..N }) do // n' = m + n for n' in takeWhile (fun n' -> 2 * m * n' <= N) (filter (fun n' -> n' % 2 = 1) (seq { m+1..m*2-1 })) do let p = 2 * m * n' for q in p..p..N do count_peri.[q] <- count_peri.[q] + 1 let larger x y = if snd x >= snd y then x else y printfn "%d" (fst (fold larger (0, 0) (seq { for k in 1..N -> (k, count_peri.[k]) })))