#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; const ll INF=1LL<<60; typedef pair P; typedef pair PP; const ll MOD=1e9+7; int main(){ int N; cin>>N; vector A(N); const int MAXA=1000000; vector cnt(MAXA+10); ll maxA=0; for(int i=0;i>A[i]; maxA=max(maxA,A[i]); cnt[A[i]]++; } vector sum(MAXA+1); for(int g=1;g<=MAXA;g++){ for(int j=g;j<=MAXA;j+=g){ sum[g]+=cnt[j];//jはgの倍数 } } vector ans(N+1,0); for(int i=1;i<=MAXA;i++){ ans[max(N-sum[i],0LL)]=i; // ans[全体N - gの倍数の個数]=i } for(int i=1;i<=N;i++){ ans[i]=max(ans[i],ans[i-1]); } for(int i=0;i ansg; for(int g=1;g<=maxA;g++){ //sumが同じならできるだけ大きいgがいい //ansg[sum[g]]=max(ansg[sum[g]],1LL*g); ansg[sum[g]]=g; } vector> t;//[個数,その値] for(auto [num,g]:ansg){ t.emplace_back(num,g); } //t.emplace_back(make_pair(0LL,1LL<<30));//番兵 t.emplace_back(make_pair(1LL<<60,1LL)); //numが小さい順にソート sort(t.begin(),t.end()); for(int K=0;K