Codeforces Round #698 (Div. 2)
Codeforces Round #698 (Div. 2)
D. Nezzar and Board
https://codeforces.com/contest/1478/problem/D
题解:每次可以选择两个数x,y,增加一个2x-y到数堆中,我们可以发现一个规律,就是每次不管怎么组合,被增加的数的系数和始终为1。
那不是其实就是说可以组合出任意种系数和为0的数,并加一个数。
考虑n个数中任意组合出系数和为0的数,我们将所有a[i]-a[i-1]算出来,并将n-1个差任意组合即可满足系数和为0,n-1个差能组合出来什么数,不正是裴蜀定理的板子题吗,最后在加任意一个a,就行了。
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
ll t,n,k,a[200007];
ll gcd(ll a,ll b){
if(b==0){
return a;
}
else{
gcd(b,a%b);
}
}
int main(){
cin>>t;
while(t--){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
ll gc=0;
for(int i=2;i<=n;i++){
ll lin=a[i]-a[i-1];
gc=gcd(lin,gc);
}
int ok=0;
for(int i=1;i<=n;i++){
if((k-a[i])%gc==0){
ok=1;
}
}
if(ok==1){
printf("YES\n");
}
else{
printf("NO\n");
}
}
}