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 }
View Code

 

posted @ 2020-12-20 20:25  不敢说的梦  阅读(253)  评论(0)    收藏  举报