标题
又是一道gcd
来自牛客网
这种思路是先找出一组数据中的最大值,并且统计每个数的个数。从最大的数开始,大致思路为,判断此时的数有几个倍数,并记录所有倍数的个数。
答案数组ans【n】,从last=2开始记录
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+50;
int a[N],ans[N];
int main(){
int n;cin>>n;
int ma=0;
for(int i=1;i<=n;i++){
int x;cin>>x;
a[x]++;
ma=max(ma,x);
}
for(int i=2;i<=n;i++) ans[i]=1;
int last=2;
for(int i=ma;i;i--){
int cnt=0;
for(int j=i;j<=ma;j+=i){//把每个a[i]加起来
cnt+=a[j];//j这个数的个数
}
cout<<cnt<<"????????"<<endl;
for(int j=last;j<=cnt;j++) {
ans[j]=i;cout<<ans[j]<<"!!!!!!!! !!!"<<endl;}
last=max(last,cnt+1);
}
for(int i=2;i<=n;i++) cout<<ans[i]<<" ";
return 0;
}