CF1478D. Nezzar and Board

CF1478D. Nezzar and Board

原题链接

描述

\(n\) 个不相同的数,我们可以重复下列操作任意次。

  • 选择两个数\(x,y\),计算 \(2x-y\) 结果放原数列。

问经过若干次操作是否能得到数字 k。

思路

假设我们选择两个数 \(x\) , \(y\),那么增加了 \(2x-y\)

假设我们选择两个数 \(a,b\),那么增加了 \(2a-b\)

假设选择两个数,它们分别是原序列的数和新增的数,取 \(a\), \(2x-y\)

则增加 \(2a-2x+y=2(a-x)+y\),或 \(2(2x-y)-a=4(x-a)-2(y-a)+a\)

同理,选择任意两个新增的数也能得到类似的结果,即任何新增的数,其大小都满足任意原序列两个数差之和加上一个原序列数,为得到 k,则判断 k-序列中的任意一个数 是否为相邻两个序列的线性组合,即为它们的公约数。

代码

#include <bits/stdc++.h>
using namespace std;
long long gcd(long long  a,long long b){
    return b==0?a:gcd(b,a%b);
}
int main(){
    int t; cin>>t; while(t--){
        int n;long long k; scanf("%d%lld",&n,&k);
        vector<long long> a(n);
        for(int i=0;i<n;i++){
            scanf("%lld",&a[i]);
        }
        long long d;
        for(int i=1;i<n;i++){
            if(i==1){
                d=a[i]-a[i-1];
            }else{
                d=gcd(d,a[i]-a[i-1]);
            }
        }
        bool flag=true;
        for(int i=0;i<n;i++){
            if((k-a[i])%d!=0){
                flag=false;break;
            }
        }
        if(flag) puts("YES");else puts("NO");
    }
    return 0;
}
posted @ 2021-01-30 21:48  ans20xx  阅读(193)  评论(0)    收藏  举报