1. 程式人生 > >又是畢業季2

又是畢業季2

傳送門

列舉答案,檢查是當前數倍數的數的個數
還有一條性質,那就是,隨著人數的遞增,所得答案遞減。
所以從上往下列舉答案即可。
程式碼如下:

#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; }