-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathproblem21.ml
More file actions
35 lines (33 loc) · 999 Bytes
/
problem21.ml
File metadata and controls
35 lines (33 loc) · 999 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
let int_pow a b = truncate ((float a) ** (float b))
let sumDivisors num =
let lim = num/2 in
let rec divide n divisor power =
match (n mod divisor) with
| 0 -> divide (n/divisor) divisor (power+1)
| _ -> (power,n)
in
let rec divaux n divisor acc =
if (n < 2) then (acc-num)
else
begin
let (power,res) = divide n divisor 0 in
match divisor with
| d when (d==(lim+1)) -> (acc-num)
| d -> divaux res (divisor+1) (acc*(((int_pow divisor (power+1))-1)/(divisor-1)))
end
in
divaux num 2 1
;;
let solve n =
let tbl = Array.make (n+5) 0 in
let rec aux i acc=
match i with
| i when (n == i) -> acc
| i -> let d = sumDivisors i in
tbl.(i) <- d;
match d with
| d when ((d<i)&&(d>0)) -> if (i == tbl.(d)) then aux (i+1) (acc + i + d) else aux (i+1) acc
| _ -> aux (i+1) acc
in
aux 1 0
;;