#include #include #include #include #include #include #include #include #include #include #include static const int MOD = 1000000007; using ll = long long; using u32 = unsigned; using u64 = unsigned long long; using namespace std; template constexpr T INF = ::numeric_limits::max()/32*15+208; int main() { int n; cin >> n; vector v(n); for (auto &&i : v) scanf("%d", &i); array, 1000> dp{}; for (int i = 0; i < 1000; ++i) { fill(dp[i].begin(),dp[i].end(), -1); } auto rec = [&](int a, int b, auto &&f) -> int { if(~dp[a][b]) return dp[a][b]; if(a == 0) return dp[a][b] = b; else return dp[a][b] = f(b%a, a, f); }; for (int i = 0; i < 1000; ++i) { for (int j = 0; j < 1000; ++j) { rec(i, j, rec); } } auto f = [&](int a, int b, auto &&f) -> int { if(max(a, b) < 1000) return dp[a][b]; if(a == 0) return b; else return f(b%a, a, f); }; using P = pair; for (int i = 1; i < n; ++i) { P val = {INF, INF}; int cur = i; for (int j = i; j < n; ++j) { P x = {v[j]*v[i-1]/f(v[i-1], v[j], f), v[j]}; if(val > x){ val = x; cur = j; } } swap(v[i], v[cur]); } for (int i = 0; i < n; ++i) { if(i) printf(" "); printf("%d", v[i]); } puts(""); return 0; }