当前位置:   article > 正文

D. Nezzar and Board (裴蜀定理&gcd)_h. nezzar and board

h. nezzar and board

D. Nezzar and Board (裴蜀定理&gcd)


题意

​ 给定 n n n个不同的数,每次操作可以选择两个数 x , y x,y x,y ( x , y x,y x,y可以相同)新增一个数 2 x − y 2x-y 2xy。给定 k k k,问是否能在若干次操作后得到 k k k


思路

​ 最后答案的形式肯定是: 2 x − y = x + ( x − y ) = k 2x-y=x+(x-y)=k 2xy=x+(xy)=k,即一个数加上(它与另一个数之差)的和组成,答案的形式是 a i + ∑ j , k ( a j − a k ) a_i+\sum\limits_{j,k}(a_j-a_k) ai+j,k(ajak)。考虑用裴蜀定理,

∑ 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(ajak)=i=2nfi(aiai1),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([aiai1]),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=2nfi(aiai1)%g=0

因此我们只需判断 ( k − a i ) % g = 0 (k-a_i)\% g=0 (kai)%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+(ajaj1)得到。

所以我们只需判断 ( k − a 1 ) % g = 0 (k-a_1)\% g=0 (ka1)%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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/75472
推荐阅读
相关标签
  

闽ICP备14008679号