// http://yukicoder.me/problems/18 open System let dprintfn fmt = Printf.kprintf Diagnostics.Debug.WriteLine fmt (* void Calc::decompositPrime(int n) { // 割る数の初期値 a = 2; // √n ≧ a ( n ≧ a * a ) の間ループ処理 while (n >= a * a) { // a で割り切れたら、a は素因数 // そして、割られる数を a で割る // a で割り切れなかったら、 a を 1 増加させる if (n % a == 0) { printf("%d * ", a); n /= a; } else { a++; } } // 最後に残った n は素因数 printf("%d\n", n); } *) module Prime = let decomposit n = let ans = ref [] let a = ref 2 let tmp = ref n while !tmp >= !a do if !tmp % !a = 0 then ans := !a :: !ans tmp := !tmp / !a else incr a if !tmp = 1 then !ans else !tmp :: !ans let solve m = let one, two = Map.fold (fun (one,two) k v -> match k with | 1 -> v%2=0, two | 2 -> one, v%2=0 | _ -> one, two ) (false, false) m let ans = match one, two with | true, true -> true | false, false -> true | true, false -> true | false, true -> false if ans then "Alice" else "Bob" [] let main argv = let N = Console.ReadLine() |> int Prime.decomposit N // |> fun a -> dprintfn "%A" a; a |> Seq.fold (fun s t -> match Map.tryFind t s with | Some v -> Map.add t 2 s | _ -> Map.add t 1 s ) Map.empty // |> fun a -> dprintfn "%A" a; a |> Map.fold (fun s _ v -> v::s) [] // |> fun a -> dprintfn "%A" a; a |> Seq.fold (fun s t -> match Map.tryFind t s with | Some v -> Map.add t (v+1) s | _ -> Map.add t 1 s ) Map.empty // |> fun a -> dprintfn "%A" a; a |> solve |> printfn "%s" 0