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
");
		}
		else{
			printf("NO
");
		}
	}
}
原文地址:https://www.cnblogs.com/whitelily/p/14345887.html