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 }