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;
}

posted @ 2022-10-31 20:18  YUGUOTIANQING  阅读(31)  评论(0)    收藏  举报