#include typedef long long ll; typedef unsigned long long ull; #define FOR(i,a,b) for(int (i)=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define RANGE(vec) (vec).begin(),(vec).end() using namespace std; template T gcd(T a, T b) { if ( a < b ) std::swap(a,b); if ( b == 0 ) return a; return gcd(b, a%b); } template inline T lcm(T a, T b) { return a*b/gcd(a,b); } class LCMsort { public: // O(N*N*log(A)) // 速度的にぎりぎりの解法 void solve1(void) { int N; cin>>N; vector a(N,0); REP(i,N) cin>>a[i]; // sort を進めるにつれソート対象列が短くなるので、実際にソートするのでなく、lcm が最も小さい // ものを取り出していくだけでよい。 // O(N^2*log(A)) REP(pivot,N) { cout< (N-2) -> ... -> (1) FOR(i, pivot+1, N) { int k = lcm(a[pivot], a[i]); if (k < mx || (k == mx && a[i] < a[mi])) { mx = k; mi = i; } } if (mi < 0) break; // pivot を入れ替えることで FOR(i, pivot+1, N) のループ回数を減らせる swap(a[pivot+1], a[mi]); } cout<>N; vector a(N,0); int maxA = 0; REP(i,N) { cin>>a[i]; maxA = max(a[i], maxA); } // 前計算として約数 -> index のマップを作っておく vector> div(N+1); // div[i] := a[i] の約数リスト vector>> S(maxA+1); // S[d] := 約数 d を持つ a[i] のリスト // pair にしているのは a[i] が小さい順にソートしておきたいから // second に i を入れることで a[i]==a[j] なら // isolve(); delete obj; return 0; } #endif