ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[Codeforces 1459C]Row GCD

2021-02-08 12:01:22  阅读:199  来源: 互联网

标签:10 gcd int ll Codeforces leq 整除 Row GCD


文章中若有不严谨或错误的地方,欢迎在评论中指出QAQ

Description

题库链接

给出长度为 \(n\) 的数组 \(a\) 和长度为 \(m\) 数组 \(b\),对于每一个 \(b_j\),输出 GCD\((a_1 + b_j, \ldots, a_n + b_j)\)。

\(1 \leq n, m \leq 2 \cdot 10^5\), \(1 \leq a_i \leq 10^{18}\), \(1 \leq b_j \leq 10^{18}\)

Solution

首先要知道 \(gcd\) 有一个性质是 \(gcd(a,b) = gcd(a,b-a)\) , 然后其扩展为 \(gcd(x,y,z) = gcd(x,y-x,z-y)\)。

所以可以看出来原式 gcd\((a_1 + b_j, \ldots, a_n + b_j)\) 可以变为 gcd\(a-1 + b_j, a_2 - a_1,a_3 - a_2 \ldots, a_n - a_{n-1}\)。

所以除第一项外其它项都是定值,可以先求后面的gcd,然后遍历 \(b_j\) 分别求最大公约数即可。

下面是 \(gcd(x,y,z) = gcd(x,y-x,z-y)\) 的简单证明:

假设 \(d = gcd(x,y,z)\),那么就有 \(d\) 能整除 \(x,y,z\),那么其必然能整除 \(x,y-x,z-y\),,所以 \(d\) 是其约数,而 \(gcd\) 为最大公约数,可以得到 \(gcd(x,y,z) \leq gcd(x,y-x,z-y)\)

反过来若 \(d = gcd(x,y-x,z-y)\),那么 \(d\) 一定能整除 \(x\),那么一定能整除 \((y-x)+x\),所以可以得到 \(gcd(x,y,z) \geq gcd(x,y-x,z-y)\)

可以证得 \(gcd(x,y,z) = gcd(x,y-x,z-y)\)

Code

#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;

const int N = 2e5+10;

ll g;
ll a[N];
ll b[N];

int main()
{
    int n,m;
    cin >> n >> m;
    for (int i = 1 ; i <= n ; i ++ ) cin >> a[i];
    for (int i = 1 ; i <= m ; i ++ ) cin >> b[i];
    sort(a+1,a+1+n);
    for (int i = 2 ; i <= n ; i ++ )
    {
        g = __gcd(a[i]-a[i-1],g);
    }
    
    for (int j = 1; j <= m ; j ++ )
    {
        cout << __gcd(a[1]+b[j],g) << ' ';
    }
    return 0;
}

标签:10,gcd,int,ll,Codeforces,leq,整除,Row,GCD
来源: https://www.cnblogs.com/Crystar/p/14386919.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有