赞
踩
本人的第一篇博客。写的不太好还请见谅w
链接: https://codeforces.com/problemset/problem/1477/C.
给定n个不同的数,每次操作可以选择两个数x , y (x y可以相同)增加一个数2x−y到数组中去。给定一个数k,问是否能在若干次操作该数组后得到k。
首先肯定需要化简题目给的表达式,将2x-y
简化成x+(x-y)
,所以最后的答案就是数列中的某一个数加上某两个数之差,可以使用裴蜀定理
对所有元素求一个gcd。判断 (k-a[1])%gcd 是否等于0就行了。
#include <bits/stdc++.h> using namespace std; #define ll long long int main() { int t; cin>>t; ll a[1000009]; while(t--) { ll n,m,ans=0; cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; ans=a[2]-a[1]; for(int i=2;i<=n;i++) { ans=__gcd(a[i]-a[i-1],ans); } //可以通过任意次操作使得m=任意一个数加上任意两个数的差。 // 所以这里的ans放下了所有数字差的gcd if((m-a[1])%ans==0) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。