赞
踩
给定 n n n个不同的数,每次操作可以选择两个数 x , y x,y x,y ( x , y x,y x,y可以相同)新增一个数 2 x − y 2x-y 2x−y。给定 k k k,问是否能在若干次操作后得到 k k k。
最后答案的形式肯定是: 2 x − y = x + ( x − y ) = k 2x-y=x+(x-y)=k 2x−y=x+(x−y)=k,即一个数加上(它与另一个数之差)的和组成,答案的形式是 a i + ∑ j , k ( a j − a k ) a_i+\sum\limits_{j,k}(a_j-a_k) ai+j,k∑(aj−ak)。考虑用裴蜀定理,
∑ j , k ( a j − a k ) = ∑ i = 2 n f i ( a i − a i − 1 ) , f i \sum\limits_{j,k}(a_j-a_k)=\sum\limits_{i=2}^n f_i(a_i-a_{i-1}),f_i j,k∑(aj−ak)=i=2∑nfi(ai−ai−1),fi为对应的系数。
令 g = g c d ( [ a i − a i − 1 ] ) , i ∈ [ 2 , n ] g=gcd([a_i-a_{i-1}]),i\in [2,n] g=gcd([ai−ai−1]),i∈[2,n]
由裴蜀定理可知: ∑ i = 2 n f i ( a i − a i − 1 ) % g = 0 \sum\limits_{i=2}^n f_i(a_i-a_{i-1})\%g=0 i=2∑nfi(ai−ai−1)%g=0。
因此我们只需判断 ( k − a i ) % g = 0 (k-a_i)\% g=0 (k−ai)%g=0。
而 a i , i ∈ [ 2 , n ] a_i,i\in[2,n] ai,i∈[2,n]都可以由 a 1 + ∑ ( a j − a j − 1 ) a_1+\sum(a_j-a_{j-1}) a1+∑(aj−aj−1)得到。
所以我们只需判断 ( k − a 1 ) % g = 0 (k-a_1)\% g=0 (k−a1)%g=0即可。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7; #define mst(a,b) memset(a,b,sizeof a) #define PII pair<int,int> #define fi first #define se second #define pb push_back int t,n; ll k,a[N]; int main(){ scanf("%d",&t);while(t--){ ll x,g=0; scanf("%d%lld",&n,&k); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=2;i<=n;i++) g=__gcd(g,a[i]-a[i-1]); puts((k-a[1])%g==0?"YES":"NO"); } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。