变小

 

不难发现每个数都不⼤实际没到1e9,这启发我们直接计算对于所有数字,以该数为因数的数字有
多少个即可。按照素数筛法的原理可知,这么做复杂度只有log n
#include<bits/stdc++.h>//因式分解 
using namespace std;
const int N=1e6+1;
int n,sum;
int buk[N]={0};//桶(方便后面计数) 
int ans[10005]={0};
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int t;
        cin>>t;
        buk[t]++;
    }
    for(int i=1;i<N;i++)
    {
        sum=0;
        for(int j=1;i*j<N;j++) sum+=buk[i*j]; 
        ans[sum]=i;//ans[i]=x表示因数有x总共有i个数 
    }
    for(int i=n-1;i>=1;i--) ans[i]=max(ans[i],ans[i+1]);//相当于n~i区间内的数字取大 
    for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
    return 0;
}

 

 
posted @ 2023-05-05 21:41  王浩泽  阅读(53)  评论(0编辑  收藏  举报