Codeforces Round #632 (Div. 2) F. Kate and imperfection 题解(gcd+埃式筛)

题目链接

题目大意

在1~n的n个数中,对于k∈[2,n],在n个数中取k个数,对这k个数两两进行gcd,输出这个gcd最大的最小值。

题目思路

我们考虑如何构造两两间最大公因数的最大值最小的集合,首先肯定是把所有质数先丢进集合里,然后再把与已经在集合内的数的最大公因数 2 的数丢进去,然后是 3 的数……然后注意到,如果我们加入了一个合数,那么他的所有因子必定已经在集合内了,于是加入的这个数字能够产生的最大公因数就是他的最大因子,因此用类似于埃筛维护这个贪心的过程,排序一遍输出即可。

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define fi first
#define se second
#define debug printf("I am here\n");
using namespace std;
typedef long long ll;
const int maxn=5e5+5;
int n,ans[maxn];
signed main(){
    scanf("%d",&n);
    ans[1]=1;
    for(int i=1;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%c",ans[i],i==n?'\n':' ');
    }
    return 0;
}

参考链接:https://blog.csdn.net/qq_43627087/article/details/105402480?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase

你可能感兴趣的:(数论)