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

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;
}
  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷酷的Herio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值