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;
}

裴蜀定理以前確實不懂


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM