又是畢業季2
阿新 • • 發佈:2018-11-06
列舉答案,檢查是當前數倍數的數的個數
還有一條性質,那就是,隨著人數的遞增,所得答案遞減。
所以從上往下列舉答案即可。
程式碼如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int vis[1000005];
int ans[1000005];
int up;
int check(int x){
if(ans[x]>0){
return ans[x];
}
int y=x;
while(y<=up){
ans[ x]+=vis[y];
y+=x;
}
return ans[x];
}
int main(){
int top=0;
scanf("%d",&n);
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
vis[x]++;
top=max(top,x);
}
up=top;
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++){
while(top>1&&check(top) <i){
top--;
}
printf("%d\n",top);
}
return 0;
}