結果
問題 | No.14 最小公倍数ソート |
ユーザー |
![]() |
提出日時 | 2022-04-17 22:13:38 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,457 ms / 5,000 ms |
コード長 | 8,162 bytes |
コンパイル時間 | 2,027 ms |
コンパイル使用メモリ | 206,524 KB |
最終ジャッジ日時 | 2025-01-28 19:01:58 |
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 20 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;using ld = long double;// --------------------------------------------------------#define FOR(i,l,r) for (ll i = (l); i < (r); ++i)#define RFOR(i,l,r) for (ll i = (r)-1; (l) <= i; --i)#define REP(i,n) FOR(i,0,n)#define RREP(i,n) RFOR(i,0,n)#define ALL(c) (c).begin(), (c).end()#define RALL(c) (c).rbegin(), (c).rend()#define SORT(c) sort(ALL(c))#define RSORT(c) sort(RALL(c))#define MIN(c) *min_element(ALL(c))#define MAX(c) *max_element(ALL(c))#define SUMLL(c) accumulate(ALL(c), 0LL)#define COUNT(c,v) count(ALL(c),(v))#define SZ(c) ((ll)(c).size())#define BIT(b,i) (((b)>>(i)) & 1)#define PCNT(b) __builtin_popcountll(b)#define P0(i) (((i) & 1) == 0)#define P1(i) (((i) & 1) == 1)#ifdef _LOCAL#define debug_bar cerr << "--------------------\n";#define debug(x) cerr << "l." << __LINE__ << " : " << #x << " = " << (x) << '\n'#define debug_pair(x) cerr << "l." << __LINE__ << " : " << #x << " = (" << x.first << "," << x.second << ")\n";template<class T> void debug_line(const vector<T>& ans, int l, int r, int L = 0) { cerr << "l." << L << " :"; for (int i = l; i < r; i++) { cerr<< ' ' << ans[i]; } cerr << '\n'; }#else#define cerr if (false) cerr#define debug_bar#define debug(x)#define debug_pair(x)template<class T> void debug_line([[maybe_unused]] const vector<T>& ans, [[maybe_unused]] int l, [[maybe_unused]] int r, [[maybe_unused]] int L =0) {}#endiftemplate<class... T> void input(T&... a) { (cin >> ... >> a); }void print() { cout << '\n'; }template<class T> void print(const T& a) { cout << a << '\n'; }template<class T, class... Ts> void print(const T& a, const Ts&... b) { cout << a; (cout << ... << (cout << ' ', b)); cout << '\n'; }template<class T> void cout_line(const vector<T>& ans, int l, int r) { for (int i = l; i < r; i++) { if (i != l) { cout << ' '; } cout << ans[i]; }cout << '\n'; }template<class T> bool chmin(T& a, const T b) { if (b < a) { a = b; return 1; } return 0; }template<class T> bool chmax(T& a, const T b) { if (a < b) { a = b; return 1; } return 0; }pair<ll,ll> divmod(ll a, ll b) { assert(a >= 0 && b > 0); return make_pair(a / b, a % b); }ll mod(ll x, ll m) { assert(m != 0); return (x % m + m) % m; }ll llceil(ll a, ll b) { if (b < 0) { return llceil(-a, -b); } assert(b > 0); return (a < 0 ? a / b : (a + b - 1) / b); }ll llfloor(ll a, ll b) { if (b < 0) { return llfloor(-a, -b); } assert(b > 0); return (a > 0 ? a / b : (a - b + 1) / b); }ll llpow(ll x, ll n) { assert(n >= 0); if (n == 0) { return 1; }; ll res = llpow(x, n>>1); res *= res; if (n & 1) { res *= x; } return res; }ll bitlen(ll b) { if (b <= 0) { return 0; } return (64LL - __builtin_clzll(b)); }ll digit_len(ll n) { assert(n >= 0); if (n == 0) { return 1; } ll sum = 0; while (n > 0) { sum++; n /= 10; } return sum; }ll digit_sum(ll n) { assert(n >= 0); ll sum = 0; while (n > 0) { sum += n % 10; n /= 10; } return sum; }ll digit_prod(ll n) { assert(n >= 0); if (n == 0) { return 0; } ll prod = 1; while (n > 0) { prod *= n % 10; n /= 10; } return prod; }ll xor_sum(ll x) { assert(0 <= x); switch (x % 4) { case 0: return x; case 1: return 1; case 2: return x ^ 1; case 3: return 0; } assert(false); }string toupper(const string& S) { string T(S); for (int i = 0; i < (int)T.size(); i++) { T[i] = toupper(T[i]); } return T; }string tolower(const string& S) { string T(S); for (int i = 0; i < (int)T.size(); i++) { T[i] = tolower(T[i]); } return T; }int a2i(const char& c) { assert(islower(c)); return (c - 'a'); }int A2i(const char& c) { assert(isupper(c)); return (c - 'A'); }int d2i(const char& d) { assert(isdigit(d)); return (d - '0'); }char i2a(const int& i) { assert(0 <= i && i < 26); return ('a' + i); }char i2A(const int& i) { assert(0 <= i && i < 26); return ('A' + i); }char i2d(const int& i) { assert(0 <= i && i <= 9); return ('0' + i); }using P = pair<ll,ll>;using VP = vector<P>;using VVP = vector<VP>;using VS = vector<string>;using VVS = vector<VS>;using VI = vector<int>;using VVI = vector<VI>;using VVVI = vector<VVI>;using VLL = vector<ll>;using VVLL = vector<VLL>;using VVVLL = vector<VVLL>;using VB = vector<bool>;using VVB = vector<VB>;using VVVB = vector<VVB>;using VD = vector<double>;using VVD = vector<VD>;using VVVD = vector<VVD>;using VLD = vector<ld>;using VVLD = vector<VLD>;using VVVLD = vector<VVLD>;const ld EPS = 1e-10;const ld PI = acosl(-1.0);constexpr ll MOD = 1000000007;// constexpr ll MOD = 998244353;constexpr int inf = (1 << 30) - 1; // 1073741824 - 1constexpr ll INF = (1LL << 62) - 1; // 4611686018427387904 - 1// --------------------------------------------------------// #include <atcoder/all>// using namespace atcoder;// エラトステネスの篩struct eratosthenes {public:// 前計算 : O(N log log N)eratosthenes(int N) : N(N) {D.resize(N+1);iota(D.begin(), D.end(), 0);for (int p : {2, 3, 5}) {for (int i = p*p; i <= N; i += p) { D[i] = p; }}vector<int> inc = {4, 2, 4, 2, 4, 6, 2, 6};int p = 7, idx = 0;int root = floor(sqrt(N) + 0.5);while (p <= root) {if (D[p] == p) {for (int i = p*p; i <= N; i += p) { D[i] = p; }}p += inc[idx++];if (idx == 8) { idx = 0; }}}// 素数判定 : O(1)bool is_prime(int x) const {assert(1 <= x && x <= N);if (x == 1) { return false; }return D[x] == x;}// 素因数分解 : O(log x), 厳密には O(Σi ei)vector<pair<int,int>> factorize(int x) const {assert(1 <= x && x <= N);vector<pair<int,int>> F;while (x != 1) {int p = D[x];int e = 0;while (x % p == 0) { x /= p; e++; }F.emplace_back(p, e);}return F;}// 約数列挙 : O(Πi(1+ei))// ※ ソートされていないことに注意vector<int> calc_divisors(int x) const {assert(1 <= x && x <= N);int n = 1; // 約数の個数vector<pair<int,int>> F;while (x != 1) {int p = D[x];int e = 0;while (x % p == 0) { x /= p; e++; }F.emplace_back(p, e);n *= (1 + e);}vector<int> divisors(n,1);int sz = 1; // 現在の約数の個数for (const auto& [p, e] : F) {for (int i = 0; i < sz * e; i++) {divisors[sz + i] = divisors[i] * p;}sz *= (1 + e);}return divisors;}// 最小素因数 (least prime factor)int lpf(int x) const { assert(1 <= x && x <= N); return D[x]; }private:int N;vector<int> D; // 最小素因数 (least prime factor)};int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout << fixed << setprecision(15);int N; input(N);VI A(N); REP(i,N) input(A[i]);int MX = 1e4;eratosthenes era(MX);VI rem(MX+1); // lpf で割り切った時の残りVI p_e(MX+1); // p_e[i] = i / rem[i]rem[0] = rem[1] = 1;p_e[0] = p_e[1] = 1;for (int i = 2; i <= MX; i++) {int x = i;int lpf = era.lpf(x);int& p = p_e[x] = 1;while (x % lpf == 0) { x /= lpf; p *= lpf; }rem[i] = x;}// g[x][y] := gcd(x,y)VVI g(MX+1, VI(MX+1, 1));for (int i = 1; i <= MX; i++) {auto& gg = g[i];for (int j = 1; j <= MX; j++) {if (rem[j] == 1) {gg[j] = gcd(i, j);} else {gg[j] = gg[j / p_e[j]] * gg[p_e[j]];}}}for (int i = 0; i < N-1; i++) {int a = A[i];pair<int,int> mn = {inf,inf};int idx = -1;for (int j = i+1; j < N; j++) {int b = A[j];pair<int,int> tmp = {b / g[a][b], b};if (chmin(mn, tmp)) idx = j;}assert(idx != -1);swap(A[i+1], A[idx]);}cout_line(A,0,N);return 0;}