题目大意:给定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;
}
View Code

 

 posted on 2021-01-29 17:35  haianx  阅读(132)  评论(0编辑  收藏  举报