1333F.Kate and Imperfection(数学)

在集合 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?"\n":" ");
    return 0;
}

 

posted @ 2020-04-12 20:27  zlc0405  阅读(207)  评论(0编辑  收藏  举报