【构造】[Atcoder Grand Contest 022]B GCD Sequence

题意:

定义一种集合,对集合中的每个数字 ai a i ,其余数字之和 sumi s u m i ,要求 GCD(ai,sumi)1 G C D ( a i , s u m i ) ≠ 1
并且,对于每个数字 a1,a2an a 1 , a 2 … … a n
要求 GCD(a1,a2,a3,an)=1 G C D ( a 1 , a 2 , a 3 , … … a n ) = 1
现在给出n,求任意一个满足的集合。


分析:

只要在集合中保证有2与3,就必然能满足 GCD(a1,a2,a3,an)=1 G C D ( a 1 , a 2 , a 3 , … … a n ) = 1
并且,由于 GCD(ai,sumi)=GCD(ai,ai+sumi) G C D ( a i , s u m i ) = G C D ( a i , a i + s u m i ) ,所以只需要满足 GCD(ai,sum)1 G C D ( a i , s u m ) ≠ 1 即可。
只要保证集合的和为6的倍数,那么2的倍数与3的倍数均可以加入,有个特征:每两个相邻的不是6的倍数的偶数,其和必然为6的倍数(2+4=6,8+10=18,……),同样的,每两个相邻的不是6的倍数的3的倍数,其和也为6的倍数(3+9=12,15+21=36,……)

根据这个性质依次插入值即可,对于n=3要特判输出样例(因为初始保证必须有2,3,也就必须有4,9,所以只能做对n 4的数据)。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define SF scanf
#define PF printf
#define MAXN 100010
using namespace std;
int n;
bool used[MAXN];
int main(){
    SF("%d",&n);
    if(n==3){
        PF("2 5 63");
        return 0;
    }
    used[2]=1,used[4]=1,used[3]=1,used[9]=1;
    n-=4;
    int x=8,y=10;
    while(n>1&&y<=30000){
        used[x]=1;
        used[y]=1;
        n-=2;
        x+=6;
        y+=6;
    }
    x=15,y=21;
    while(n>1&&y<=30000){
        used[x]=1;
        used[y]=1;
        n-=2;
        x+=12;
        y+=12;
    }
    x=6;
    while(n>0&&x<=30000){
        used[x]=1;
        x+=6;
        n--;
    }
    for(int i=2;i<=30000;i++)
        if(used[i]==1)
            PF("%d ",i);
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值