题面:
题解:
统计每个因数出现的次数。
对于每个出现次数维护最大的因数。
逆向更新
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define pr make_pair
#define pb push_back
using namespace std;
const int maxn=1001000;
int p[maxn],c[maxn];
void fi(int x)
{
int sq=sqrt(x);
for(int i=1;i<=sq;i++)
{
if(x%i!=0) continue;
p[i]++;
if(i*i!=x)
p[x/i]++;
}
}
int main(void)
{
int n,x;
scanf("%d",&n);
//求每个因数出现的次数
for(int i=1;i<=n;i++)
scanf("%d",&x),fi(x);
//对每个次数记录最大的因数
for(int i=1;i<maxn;i++)
c[p[i]]=max(c[p[i]],i);
//逆向更新
for(int i=n-1;i>=1;i--)
c[i]=max(c[i],c[i+1]);
for(int i=1;i<=n;i++)
printf("%d\n",c[i]);
return 0;
}