题意:
给定一个长度为n的数组a[i],和长度为m的数组b[j],求每个a[i]与b[j]相加后的gcd(a[1]+b[j],a[2]+b[j],...,a[n]+b[j])
思路
由辗转相除法可知:gcd(a,b)=gcd(a,|a-b|)=gcd(a,|b-a|);
因此可知gcd(a[1]+b[j],a[2]+b[j]......a[n]+b[j])=gcd(a[1]+b[j],gcd(∣a[2]−a[1]∣,∣a[3]−a[1]∣......a[n]−a[1]));
所以可以先求的gcd(∣a[2]−a[1]∣,∣a[3]−a[1]∣......a[n]−a[1]));
代码如下
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5+10;
int a[N];
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
int ans =0;
for(int i=2;i<=n;i++){
ans = __gcd(ans,a[i]-a[1]);
}
while(m--){
int x;
cin>>x;
cout<<__gcd(ans,a[1]+x)<<endl;
}
return 0;
}