CF691 Div2 Row GCD
题目链接:Row GCD
题目大意:
给两个数组,A,B,(元素个数分别为n,m)要求输出一行m个数,为GCD(a1+bj, a2+bj, a3+bj...an+bj)
思路:
gcd有性质:gcd(x,y) = gcd(x,y-x),在求多个数的gcd时性质同样适用,GCD(a1+bj, a2+bj, a3+bj...an+bj) = GCD(a1+bj, a2-a1, a3-a1...an-a1),可以提前处理出
GCD(a2-a1, a3-a1, ... , an-a1)
参考代码
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll a[200010],n,m; 5 ll gcd(ll a, ll b) { 6 return b == 0 ? a : gcd(b,a%b); 7 } 8 int main() { 9 cin >> n >> m; 10 ll gd = 0; 11 for(ll i = 1; i <= n; i++) { 12 cin >> a[i]; 13 } 14 sort(a+1,a+n+1); // sort防止减去a[1]出现负数 15 for(ll i = 2; i <= n; i++) { 16 gd = gcd(gd,a[i]-a[1]); 17 } 18 for(ll i = 1,x; i <= m; i++) { 19 cin >> x; 20 cout << gcd(gd,a[1]+x) << " "; 21 } 22 return 0; 23 }

浙公网安备 33010602011771号