let () = let rec primes (n : int) (m : int) (k : int) (lst : int list) = if n < m then lst else if n mod m = 0 then primes (n/m) m k (m :: lst) else if m = 2 then primes n (m+1) k lst else primes n (m+2) k lst in let rec insert x lst = match lst with | [] -> [(1, x)] | (cnt, num) :: t -> if num = x then (cnt+1, num) :: t else (cnt,num) :: insert x t in let rec expN num cnt = if cnt = 0 then 1 else num * expN num (cnt-1) in Scanf.scanf "%d\n" @@ fun n -> let lst = primes n 2 n [] in let slst = List.fold_left (fun lst x -> insert x lst) [] lst in let (a,b) = List.fold_left (fun (a, b) (cnt, num) -> if cnt mod 2 = 0 then (a * (expN num (cnt/2)), b) else if cnt = 1 then (a, b * num) else (a * (expN num (cnt/2)), b * num)) (1,1) slst in Printf.printf "%d %d\n" a b