题目大意:给定n个数字,任意选择x和y得到2x-y,数字被选择后仍然可选择,问给定k是否可以由这些数字进行变化得到。
解题思路:通过2x-y可以发现可以出现的数字的系数和为1,下面做一个简单的例子
x y -> 2x-y
2x-y y->4x-2y-y=4x-3y
具体证明可用数学归纳法,由于很明显,这里不做证明
即使得到这个系数和为1的结论,看起来并没有什么用
这里引入裴蜀定理:设a1,a2,a3......an为n个整数,d是它们的最大公约数,那么存在整数x1......xn使得x1*a1+x2*a2+...xn*an=d。
那么,我们只要保证系数和为1,求得gcd,得到的gcd一定是可以出现的数字的因子。
#include<stdio.h> #include<algorithm> #include<math.h> using namespace std; typedef long long ll; const int maxn=2e5+5; ll a[maxn]; ll gcd(ll a,ll b){ if(b==0) return a; else return gcd(b,a%b); } int main() { int t,n; ll m; scanf("%d",&t); while(t--){ scanf("%d%lld",&n,&m); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); ll g=0; for(int i=1;i<n;i++){ g=gcd(g,abs(a[n]-a[i])); } if((m-a[n])%g==0) printf("YES\n"); else printf("NO\n"); } return 0; }