题目大意
给定 N N (),构造一个长度为 N N 的序列,使得其中每个数, 1≤ai≤30000 1 ≤ a i ≤ 30000 , gcd(a1,a2,a3...an)=1 g c d ( a 1 , a 2 , a 3 . . . a n ) = 1 , gcd(ai,∑nj=1,j≠iaj)≠1 g c d ( a i , ∑ j = 1 , j ≠ i n a j ) ≠ 1 ,所有数不重复。
题解
最后一个条件即:所有数的和与其中每个数都有公因子,为了构造,我们指定这种公因子为2和3。
首先在答案中加入2,3,保证了所有数的最大公因数为1,然后添加2的倍数和3的倍数,还需要保证所有数的和为2和3的倍数,所以我们只能先添加
N−1
N
−
1
个2、3的倍数,最后一个数用于调整和,使得总和为2和3的倍数,还要保证总和与最后一个数不互质,暴力判断即可。
代码
#include<cstdio>
const int MAXN=20005,MAXV=30001;
int ans[MAXN];
bool used[MAXV];
int gcd(int a,int b)
{return b==0?a:gcd(b,a%b);}
int main()
{
int n,sum=0,i,j;
scanf("%d",&n);
for(i=1,j=1;j<n;i++)//添加n-1个2、3的倍数
if(i%2==0||i%3==0)
{
ans[j++]=i;
used[i]=true;
sum+=i;
}
int r2=sum%2,r3=sum%3;
for(i=1;j<=n;i++)//枚举最后一个数
if(!used[i]&&(i+r2)%2==0&&(i+r3)%3==0&&gcd(i,sum)!=1)
ans[j++]=i;
for(int i=1;i<n;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n]);
return 0;
}