// http://yukicoder.me/problems/38 open System open System.Collections.Generic let dpfn fmt = Printf.kprintf Diagnostics.Debug.WriteLine fmt let factors n = let i = ref 2 let tmp = ref n seq { while !i * !i <= n do if !tmp % !i = 0 then tmp := !tmp / !i yield !i else incr i if !tmp <> 1 then yield !tmp } [] let main argv = let add k m = match Map.tryFind k m with | None -> 0 | Some x -> x |> fun v -> Map.add k (v+1) m let merge a b = Map.fold (fun a' bk bv -> match Map.tryFind bk a' with | None -> Map.add bk bv a' | Some av -> Map.add bk (max av bv) a' ) a b let pow (a : int) b = bigint.Pow(bigint a, b) let lcm a b = merge a b |> Map.fold (fun s k v -> s * pow k v) 1I let lcmsort xs = let rec f acc = function | [] -> List.rev acc | (a,m) :: ax -> let ax' = ax |> List.map (fun (i,j) -> lcm m j, i, j) |> List.sort // |> fun x -> x |> List.map (fun (k,i,j) -> string (k,i,j)) |> String.concat " " |> dpfn "%s"; x |> List.map (fun (_,i,j) -> i,j) f (a :: acc) ax' f [] xs let N = Console.ReadLine().Trim() |> int let A = Console.ReadLine().Trim().Split([|' '|]) |> Array.map int A |> List.ofArray |> List.map (fun a -> a, factors a) // |> fun x -> dpfn "%A" x; x |> List.map (fun (a,fs) -> a, fs |> Seq.fold (fun m t -> add t m) Map.empty) // |> fun x -> dpfn "%A" x; x |> lcmsort |> List.map string |> String.concat " " |> printfn "%s" 0 // 整数の終了コードを返します