結果
| 問題 | No.14 最小公倍数ソート |
| コンテスト | |
| ユーザー |
beet
|
| 提出日時 | 2018-11-08 12:08:24 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 70 ms / 5,000 ms |
| コード長 | 1,352 bytes |
| 記録 | |
| コンパイル時間 | 2,063 ms |
| コンパイル使用メモリ | 214,640 KB |
| 最終ジャッジ日時 | 2025-01-06 15:51:33 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 20 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using Int = long long;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}
//INSERT ABOVE HERE
signed main(){
Int n;
cin>>n;
vector<Int> a(n);
for(Int i=0;i<n;i++) cin>>a[i];
vector<vector<Int> > ds(n);
for(Int i=0;i<n;i++){
for(Int j=1;j*j<=a[i];j++){
if(a[i]%j) continue;
ds[i].emplace_back(j);
if(j!=a[i]/j) ds[i].emplace_back(a[i]/j);
}
sort(ds[i].begin(),ds[i].end());
}
const Int MAX = 1e4+100;
vector<multiset<Int> > vs(MAX);
auto add=[&](Int i){
for(Int x:ds[i]) vs[x].emplace(a[i]);
};
auto rmv=[&](Int i){
for(Int x:ds[i]) vs[x].erase(vs[x].find(a[i]));
};
for(Int i=1;i<n;i++) add(i);
map<Int, Int> rev;
for(Int i=0;i<n;i++) rev[a[i]]=i;
vector<Int> b(n);
b[0]=a[0];
for(Int i=0;i+1<n;i++){
Int cur=b[i],nxt=1e15;
for(Int x:ds[rev[cur]]){
if(vs[x].empty()) continue;
Int k=*vs[x].begin();
if(nxt/__gcd(cur,nxt)>k/__gcd(cur,k)) nxt=k;
if(nxt/__gcd(cur,nxt)==k/__gcd(cur,k)&&nxt>k) nxt=k;
}
b[i+1]=nxt;
rmv(rev[nxt]);
}
for(Int i=0;i<n;i++){
if(i) cout<<" ";
cout<<b[i];
}
cout<<endl;
return 0;
}
beet