在集合 S={1,2,⋯,n}S=1,2,⋯,n 中,对于每个正整数 kk ,找出一个大小为 kk 的子集,使得该子集中两两间最大公因数的最大值最小,求这个最小值。
题解:
开一个映射数组,初始化1-N+1的映射都是1,然后从2开始,把1-N范围内每个因数是i的映射改为i,这样遍历一遍可以保证每个数的映射存的是最大公因数。然后对映射排序,从小到大输出映射的值。
#include<bits/stdc++.h> using namespace std; const int maxn=5e5+100; int a[maxn]; int N,M; int main () { scanf("%d",&N); for (int i=1;i<=N+1;i++) a[i]=1; for (int i=2;i<=N;i++) { for (int j=2*i;j<=N;j+=i) a[j]=i; } sort(a+1,a+1+N); for (int i=2;i<=N;i++) printf("%d%s",a[i],i==N?" ":" "); return 0; }