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