結果

問題 No.14 最小公倍数ソート
ユーザー pocaristpocarist
提出日時 2015-10-07 13:09:59
言語 F#
(F# 4.0)
結果
TLE  
実行時間 -
コード長 1,893 bytes
コンパイル時間 11,863 ms
コンパイル使用メモリ 202,004 KB
実行使用メモリ 59,264 KB
最終ジャッジ日時 2024-07-20 01:52:09
合計ジャッジ時間 16,946 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 102 ms
36,480 KB
testcase_01 AC 105 ms
32,896 KB
testcase_02 AC 110 ms
33,024 KB
testcase_03 AC 2,307 ms
59,264 KB
testcase_04 TLE -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.fsproj を復元しました (320 ms)。
MSBuild のバージョン 17.9.6+a4ecab324 (.NET)
  main -> /home/judge/data/code/bin/Release/net8.0/main.dll
  main -> /home/judge/data/code/bin/Release/net8.0/publish/

ソースコード

diff #

// 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
    }

[<EntryPoint>]
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 // 整数の終了コードを返します
0