1 #include<bits/stdc++.h>
2 using namespace std;
3
4 const int inf=1e6+5;//最大能力值
5 const int maxn=1e5+5;//最多学生
6 int n;
7 int vis[inf];// 每个能力值出现的次数
8 int num[inf];// 每个能力值倍数的个数
9 int ans[maxn];
10
11 int main(){
12 int m;
13 int maxnn=maxn;
14
15 cin>>n;
16 //找每个能力值出现的次数
17 for(int i=1;i<=n;i++)
18 {
19 cin>>m;
20 ++vis[m];
21 maxnn=max(maxnn,m);//优化
22 }
23 //找每个能力值 倍数 的个数
24 for(int i=1;i<=maxnn;i++)
25 for(int j=i;j<=maxnn;j+=i)//!!!j从i开始循环
26 num[i]+=vis[j];
27 //i这个数出现过num[i],没出现过!num[i]
28 //i从小到大枚举,会把之前找到的更小的答案给覆盖掉
29 for(int i=1;i<=maxnn;i++)
30 for(int j=num[i];j>=1;j--)//num[i]表示i这个数是几个数的因数,
31 ans[j]=i; //也就是能被几个数整除,这个循环可以找出
32 //能被1~n个数整除的数中最大的(i从小到大枚举)
33 //也就是找出任意1~n个数的最大公因数
34
35 for(int i=1;i<=n;i++)
36 cout<<ans[i]<<endl;
37
38 return 0;
39 }