前言
我居然又忘了
n+n/1+n/2+n/3+n/4+.....+n/n=nlogn
于是我就没有想出来这题QAQ
题解
如果我记得上面这个结论的话,就好做了
我们从大到小枚举答案,判断是否可行
对于第i个答案,它是ans的可行方案当且仅当它可以有i个数,使得他们都有这个这个因子,于是你就可以暴力地加它倍数出现的次数,累计判断一下就可以了
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1000005;
int n;
int ans[N];//这个答案
int cnt[N];
int mx=0;
int main()
{
scanf("%d",&n);
for (int u=1;u<=n;u++)
{
int a;
scanf("%d",&a);
cnt[a]++;
mx=max(mx,a);
}
int mn=1;//现在填到多少了
for (int u=mx;u>=1;u--)
{
int lalal=0;
for (int i=1;i*u<=mx;i++)
lalal=lalal+cnt[i*u];
for (int i=mn;i<=lalal;i++)
ans[i]=u;
mn=max(mn,lalal+1);
}
for (int u=1;u<=n;u++) printf("%d\n",ans[u]);
return 0;
}