//http://yukicoder.me/problems/29 #include #include #include #include #include #include #include #include #include #include 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 factors(int n) { map 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; } /* [] 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 merge(const map& a, const map& b) { map ret(a); for (const auto& i : b) { ret[i.first] = max(ret[i.first], i.second); } return ret; } int64_t lcm(const map& a, const map& b) { map facts = merge(a, b); int64_t ret = 1LL; for (const auto& i : facts) { ret *= ipow(i.first, i.second); } return ret; } vector lcmsort(const vector>>& xs) { vector acc; vector>> tmp(xs); auto it = tmp.begin(); while (it != tmp.end()) { int a; map m; tie(a, m) = *it; ++it; acc.push_back(a); priority_queue> 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>> xs(N); for (int i = 0; i < N; i++) { int A; cin >> A; xs[i] = make_pair(A, factors(A)); } vector ans = lcmsort(xs); for (int i = 0; i < N; i++) { if (i>0) cout << ' '; cout << ans[i]; } cout << endl; return 0; }