C. Row GCD Codeforces Round #691 (Div. 2)

题意 :对于该题,求GCD(ai+bj,ai+1+bj······,an+bj);

思路:利用gcd(x,y)=gcd(x-y,y)可以将上式都减去a1+bj转化为GCD(a1+bj,…,an+bj)=GCD(a1+bj,a2−a1,…,an−a1).

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MX=2e5+9;
ll a[MX],c[MX],lim;
int n,m;

ll __gcd(ll a,ll b){
    if( b ) return gcd(b,a%b);
    else return a;
}

int main()
{
   // freopen("input.txt","r",stdin);
    while( ~scanf("%d %d",&n,&m) ){
        for( int i=1 ; i<=n ; i++ ){
            scanf("%lld",&a[i]);
            c[i]=a[i]-a[i-1];
        }
        ll ans=c[2];
        for( int i=2 ; i<=n ; i++ )
            ans=__gcd(ans,c[i]);
        for( int j=1 ; j<=m ; j++ ){
            scanf("%lld",&lim);
            printf("%lld\n",__gcd(ans,lim+a[1]));
        }
    }
    return 0;
}

 

posted @ 2021-03-13 11:12  大抵一个菜鸡而已  阅读(36)  评论(0编辑  收藏  举报