【AGC022 B】【AtCoder3947】GCD Sequence

题目大意

给定 N 3 N 20000 ),构造一个长度为 N 的序列,使得其中每个数 a i 1 a i 30000 g c d ( a 1 , a 2 , a 3 . . . a n ) = 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 个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-123的倍数
        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;
}

猜你喜欢

转载自blog.csdn.net/can919/article/details/79838727