【luoguP1414]】又是毕业季II
题目链接
\(solution\)
暴力求每个数有多少个倍数,从大到小,数\(i\)的倍数有\(f_i\)个,那么选\(1\)~\(f_i\)个同学的答案可以为\(i\),取第一次更新的答案最大
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN=1000010;
int n,a[MAXN],f[MAXN],ans[MAXN];
int Max=0;
int main()
{
scanf("%d",&n);
int x;
for(int i=1;i<=n;++i){
scanf("%d",&x);
++a[x];
Max=max(Max,x);
}
for(int i=Max;i>=1;--i)
for(int j=i;j<=Max;j+=i)
f[i]+=a[j];
int r=0;
for(int i=Max;i>=1&&r<=n;--i)
if(f[i])
while(r+1<=f[i]) ans[++r]=i;
for(int i=1;i<=n;++i)
printf("%d\n",ans[i]);
return 0;
}