#include #include #include #include #include int main() { std::map> d; // d[n]=ak@(ak%(n)==0) int N; std::cin >> N; std::vector ans, a(N); for (auto& i : a) std::cin >> i; std::sort(a.begin() + 1, a.end()); for (int i = 1; i < N; i++) { for (int j = 1; j * j <= a[i]; j++) if (a[i] % j == 0) { if (j * j != a[i]) d[a[i] / j].insert(a[i]); d[j].insert(a[i]); } } ans.push_back(a[0]); while (ans.size() < N) { int min = 10001, min_an; for (int j = 1; j * j <= ans.back(); j++) if (ans.back() % j == 0) { if (d.contains(j)) { int an = *(d[j].begin()); if (min > an / j) { min = an / j; min_an = an; } } if (d.contains(ans.back() / j)) { int an = *(d[ans.back() / j].begin()); if (min > an / (ans.back() / j)) { min = an / (ans.back() / j); min_an = an; } } } ans.push_back(min_an); for (int j = 1; j * j <= min_an; j++) if (min_an % j == 0) { if (j * j != min_an) { d[min_an / j].erase(d[min_an / j].find(min_an)); if (d[min_an / j].empty()) d.erase(min_an / j); } d[j].erase(d[j].find(min_an)); if (d[j].empty()) d.erase(j); } } for (auto n : ans) std::cout << n << " "; std::cout << std::endl; return 0; }