添加链接描述
题意: 在1~n的n个数中,对于k∈[2,n],在n个数中取k个数,对这k个数两两进行gcd,输出这个gcd最小的最大值。
思路:我们尽可能选质数加入集合,如果质数不够呢就选因子只含2的倍数,再不够的时候再3的倍数,这个过程用埃式筛维护。
比赛的时候可能有点难想,但还有个更直接的,你可以1到10打个表,从后往前看,你发现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e5+1;
int n,ans[maxn];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) ans[i]=1;
for(int i=2;i<=n;++i) for(int j=2*i;j<=n;j+=i) ans[j]=i;
sort(ans+1,ans+1+n);
for(int i=2;i<=n;++i) printf("%d ",ans[i]);
}