Problem 23
module Problem_0023
/// 約数リスト
let inline getDivList n =
let rec finddiv l i =
if n <= i then l
elif n%i=0 then
finddiv (i::l) (i+1)
else
finddiv l (i+1)
finddiv [] 1
// 過剰数チェック
let inline isAN n =
let sum = List.sum(getDivList n)
(n < sum)
// 4179871
// 1905 ms~~2025 ms
let calc () =
let max = 28123
let arr = [| 1..max |]
let chkANs = [| for i in 0..max -> isAN i |]
let calcANs = arr |> Array.filter (fun i -> chkANs.[i])
// 1..28123 の値の元となる項が過剰数かをチェック
arr
|> Array.filter (fun n ->
// a+b=n を計算する
calcANs // 過剰数リストを検索対象とする。
|> Array.exists (fun a ->
let b = n - a
if a >= n then false
else chkANs.[b]
// 過剰数チェックリストから n-a を計算した b の値
// が過剰数かどうかをチェック
)
|> (not)
)
|> Array.sum
let run () =
calc ()