結果
問題 | No.14 最小公倍数ソート |
ユーザー | pocarist |
提出日時 | 2015-10-07 17:06:17 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,583 bytes |
コンパイル時間 | 1,951 ms |
コンパイル使用メモリ | 93,368 KB |
実行使用メモリ | 12,292 KB |
最終ジャッジ日時 | 2024-07-20 01:53:16 |
合計ジャッジ時間 | 7,743 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | WA | - |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | WA | - |
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 | -- | - |
ソースコード
//http://yukicoder.me/problems/29 #include <iostream> #include <queue> #include <vector> #include <tuple> #include <algorithm> #include <functional> #include <set> #include <map> #include <limits> #include <cstdint> using namespace std; /* 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 } */ map<int, int> factors(int n) { map<int, int> ret; int i = 2; int tmp = n; while (i*i <= n) { if (tmp % i == 0) { tmp /= i; ret[i]++; } else { i++; } } if (tmp != 1) { ret[tmp]++; } return ret; } /* [<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 // 整数の終了コードを返します */ int64_t ipow(int64_t base, int exp) { int64_t result = 1LL; while (exp) { if (exp & 1) { result *= base; } exp >>= 1; base *= base; } return result; } map<int, int> merge(const map<int, int>& a, const map<int, int>& b) { map<int, int> ret(a); for (const auto& i : b) { ret[i.first] = max(ret[i.first], i.second); } return ret; } int64_t lcm(const map<int, int>& a, const map<int, int>& b) { map<int, int> facts = merge(a, b); int64_t ret = 1LL; for (const auto& i : facts) { ret *= ipow(i.first, i.second); } return ret; } vector<int> lcmsort(const vector<pair<int, map<int, int>>>& xs) { vector<int> acc; vector<pair<int, map<int, int>>> tmp(xs); auto it = tmp.begin(); while (it != tmp.end()) { int a; map<int, int> m; tie(a, m) = *it; ++it; acc.push_back(a); priority_queue<pair<int64_t, decltype(it)>> q; for (auto i = it; i != tmp.end(); ++i) { auto v = lcm(i->second, m); q.push(make_pair(-v, i)); } if (!q.empty()) { auto it2 = q.top().second; swap(*it, *it2); } } return acc; } int main() { int N; cin >> N; vector<pair<int, map<int, int>>> xs(N); for (int i = 0; i < N; i++) { int A; cin >> A; xs[i] = make_pair(A, factors(A)); } vector<int> ans = lcmsort(xs); for (int i = 0; i < N; i++) { if (i>0) cout << ' '; cout << ans[i]; } cout << endl; return 0; }