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;
}

浙公网安备 33010602011771号