题意:
定义一种集合,对集合中的每个数字aiai,其余数字之和sumisumi,要求GCD(ai,sumi)≠1GCD(ai,sumi)≠1
并且,对于每个数字a1,a2……ana1,a2……an,
要求GCD(a1,a2,a3,……an)=1GCD(a1,a2,a3,……an)=1
现在给出n,求任意一个满足的集合。
分析:
只要在集合中保证有2与3,就必然能满足GCD(a1,a2,a3,……an)=1GCD(a1,a2,a3,……an)=1
并且,由于GCD(ai,sumi)=GCD(ai,ai+sumi)GCD(ai,sumi)=GCD(ai,ai+sumi),所以只需要满足GCD(ai,sum)≠1GCD(ai,sum)≠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);
}