首先我们要统计出1~n以内素数的个数cnt。
如果k<=cnt,显然所有素数都互质,
M
a
x
g
c
d
(
a
i
,
a
j
)
Max_{gcd(ai,aj)}
Maxgcd(ai,aj)=1.
接下来k>cnt,我们要怎么考虑呢?
首先如果你加入一个x,那么为了使得产生的gcd尽可能小,x的每一个因子(不包括它本身)必然已经在集合里了,那么x的加入对答案的贡献就是x的因数中小于x并且最大的那一个。
素数对答案的贡献为1,合数对答案的贡献为小于它本身的它自己的最大因数。
显然一个合数的因数对答案的贡献一定小于该合数,如果按照贡献排序,即可确保一个合数加入前,它的所有因数不包括他自身已经在集合中。
所以,我们可以通过排序得到对应长度的最佳答案。
求每个数的最大因数用的是埃氏筛法
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 1500005
int mul[MAXN];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=2*i;j<=n;j+=i)
mul[j]=i;
}
sort(mul,mul+1+n);
for(int i=2;i<=n;i++)
printf("%d%c",mul[i],i==n?'\n':' ');
}