結果
| 問題 |
No.14 最小公倍数ソート
|
| コンテスト | |
| ユーザー |
pocarist
|
| 提出日時 | 2015-10-07 17:06:17 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 2 WA * 2 TLE * 1 -- * 15 |
ソースコード
//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;
}
pocarist