D. Nezzar and Board - Codeforces Round #698 (Div. 2)
作者:互联网
D. Nezzar and Board
https://codeforces.com/contest/1478/problem/D
题解
题意为给出一个序列xi,你可以任意挑选两个数x,y将2·x-y加入序列中,询问在是否可以在序列中发现数k。
假设我们任意挑选4个数:x,y,p,q并且将2·x-y、2·p-q加入到序列中,挑选出新增的两个数:2·x-y、2`·p-q得到2·(2·x-y)-(2·p-q),化简:(2·x-p)+2(x-y)-(p-q) ,即:x+(x-p)+2(x-y)-(p-q)。
由此我们可以得到的值的范围是(ai-aj)经过线性组合后与ap的和能取到的所有数,判断k是否在这个范围内即可。
求出(ai-aj)需要n2的复杂度,因为n是2e5,直接求会T,因此我们只需求出(ai-ai-1)即可,(ai-ai-1)经过线性组合会得出所有的(ai-aj)。
最后只需判断(ai-aj)经过线性组合是否可以得到k-ap。
所以只需要判断k-ap是否存在因子d即可。
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int N=2e5+7;
const ll mod=998244353;
ll a[N];
ll gcd(ll x,ll y){
if(!y)return x;
else return gcd(y,x%y);
}
int main(){
IO;
int t=1;
cin>>t;
while(t--){
ll n,k;
cin>>n>>k;
ll g;
for (int i = 0; i < n; ++i)
{
cin>>a[i];
if(i==1)g=a[i]-a[i-1];
else g=gcd(g,a[i]-a[i-1]);
}int flag=0;
for (int i = 0; i < n; ++i)
{
if(abs(k-a[i])%g==0){
flag=1;
break;
}
}if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
裴蜀定理以前确实不懂
标签:Nezzar,const,ai,698,aj,Codeforces,cin,int,ll 来源: https://www.cnblogs.com/KeepInCode/p/14344154.html