A. Row GCD
题意:
一个a数组,一个b数组,要求对于a中每一个数加上\(b_j\)中的一个数\(1 <= j <= m\),求gcd
思路:
有一个新的方法叫作辗转相减法,就是gcd(a, b, c, d) = gcd(a, |b - a|, |c - a|, |d - a|),有了这个性质,不就秒了吗
总结:
辗转相减法
点击查看代码
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);
#define endl '\n'
using namespace std;
typedef long long ll;
const ll MAXN = 2e5 + 10;
ll n, m, mx = 0;
ll a[MAXN], b[MAXN];
ll gcd(ll a, ll b)
{
return b == 0 ? a : gcd(b, a % b);
}
int main()
{
IOS; cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; ++i)
cin >> a[i];
for (int i = 1; i <= m; ++i)
cin >> b[i];
if (n == 1)
{
for (int i = 1; i <= m; ++i)
cout << a[1] + b[i] << " ";
exit(0);
}
ll gcdd = abs(a[2] - a[1]);
for (int i = 3; i <= n; ++i)
gcdd = gcd(gcdd, abs(a[i] - a[1]));
for (int i = 1; i <= m; ++i)
cout << gcd(a[1] + b[i], gcdd) << " ";
return 0;
}