Problem - 1458A - Codeforces
思路:
首先得知道gcd的两个基本性质:
(1) gcd(a,b)=gcd(a,|b-a|)
(2) gcd(a,b,c)=gcd(a,gcd(b,c))
结合题目所给的a1+bj,a2+bj...... an+bj
根据第一条性质得到:
gcd(a1+bj,a2+bj)=gcd(a1+bj,|a2+bj-a1-bj|)=gcd(a1+bj,|a2-a1|)
同时结合第二条性质
gcd(a1+bj,a2+bj...... an+bj)=gcd(a1+bj,|a2-a1|,|a3-a1|,......|an-a1|)。
所以我们需要先处理出gcd(|a2-a1|,|a3-a1|,......|an-a1|),再每次与a1+bj进行gcd就可以得到答案了
Code:
void solve()
{int n,m,sum=0;cin>>n>>m;vector<int> a(n),b(m);for(auto &t:a) cin>>t;for(auto &t:b) cin>>t;for(int i=1;i<n;i++) sum=__gcd(sum,abs(a[0]-a[i]));for(int i=0;i<m;i++){cout<<__gcd(sum,a[0]+b[i])<<' ';}
}