Codeforces 题解 —— Row GCD —— 数学题

题目相关

题目链接

Codeforces Round #691 (Div. 1) https://codeforces.com/problemset/problem/1458/A

Problem Statement

You are given two positive integer sequences a 1 , … , a n a_1, …, a_n a1,,an and b 1 , … , b m b_1, …, b_m b1,,bm. For each j = 1 , … , m j=1, …, m j=1,,m find the greatest common divisor of a 1 + b j , … , a n + b j a_1+b_j, …, a_n+b_j a1+bj,,an+bj.

Input

The first line contains two integers n n n and m m m ( 1 ≤ n , m ≤ 2 ⋅ 1 0 5 1 ≤ n, m ≤ 2⋅10^5 1n,m2105).
The second line contains n integers a 1 , … , a n a_1, …, a_n a1,,an ( 1 ≤ a i ≤ 1 0 18 1 ≤ a_i ≤ 10^{18} 1ai1018).
The third line contains m integers b 1 , … , b m b_1, …, b_m b1,,bm ( 1 ≤ b j ≤ 1 0 18 1 ≤ b_j ≤ 10^{18} 1bj1018).

Output

Print m m m integers. The j j j-th of them should be equal to G C D ( a 1 + b j , … , a n + b j ) GCD(a_1+b_j, …, a_n+b_j) GCD(a1+bj,,an+bj).

Sample Input

4 4
1 25 121 169
1 2 7 23

Sample Output

2 3 8 24

题解报告

题目翻译

给两个正整数序列 a 1 , … , a n a_1, …, a_n a1,,an b 1 , … , b m b_1, …, b_m b1,,bm,求对于每个 j = 1 , … , m j=1, …, m j=1,,m a 1 + b j , … , a n + b j a_1+b_j, …, a_n+b_j a1+bj,,an+bj 最大公约数。

题目分析

本题是一个数学题。考点在于最大公约数的性质。由于数据量大,因此本题需要一个时间复杂度为 O ( N ) O(N) O(N) 的算法。
我们需要使用最大公约数的两个性质:
1、结合律。 g c d ( a , b , c ) = g c d ( a , g c d ( b , c ) ) = g c d ( g c d ( a , b ) , c ) gcd(a,b,c)=gcd(a, gcd(b, c)) = gcd(gcd(a, b), c) gcd(a,b,c)=gcd(a,gcd(b,c))=gcd(gcd(a,b),c)
2、 g c d ( a , b ) = g c d ( b , a b ) = g c d ( b , ∣ a − b ∣ ) = g c d ( a , ∣ a − b ∣ ) gcd(a,b)=gcd(b, \frac{a}{b})=gcd(b, \lvert a-b \rvert)=gcd(a, \lvert a-b \rvert) gcd(a,b)=gcd(b,ba)=gcd(b,ab)=gcd(a,ab)
下面我们来推到一下 g c d ( a 1 + b j , … , a n + b j ) gcd(a_1+b_j, …, a_n+b_j) gcd(a1+bj,,an+bj) 如何计算,为了方便起见,我们推导 g c d ( a 1 , a 2 , a 3 ) gcd(a_1, a_2, a_3) gcd(a1,a2,a3)
g c d ( a 1 , a 2 , a 3 ) ⇒ g c d ( a 2 , a 1 , a 3 ) ⇒ g c d ( a 2 , g c d ( a 1 , a 3 ) ) ⇒ g c d ( a 2 , g c d ( a 1 , ∣ a 1 − a 3 ∣ ) ) ⇒ g c d ( a 2 , a 1 , ∣ a 1 − a 3 ∣ ) ⇒ g c d ( ∣ a 1 − a 3 ∣ , a 1 , a 2 ) ⇒ g c d ( ∣ a 1 − a 3 ∣ , g c d ( a 1 , a 2 ) ) ⇒ g c d ( ∣ a 1 − a 3 ∣ , g c d ( a 1 , ∣ a 1 − a 2 ∣ ) ) ⇒ g c d ( ∣ a 1 − a 3 ∣ , a 1 , ∣ a 1 − a 2 ∣ ) ⇒ g c d ( a 1 , ∣ a 1 − a 2 ∣ , ∣ a 1 − a 3 ∣ ) gcd(a_1, a_2, a_3)\Rightarrow gcd(a_2, a_1, a_3)\Rightarrow gcd(a_2, gcd(a_1, a_3)) \\ \Rightarrow gcd(a_2, gcd(a_1, \lvert a_1-a_3 \rvert))\Rightarrow gcd(a_2, a_1, \lvert a_1-a_3 \rvert)\\\Rightarrow gcd(\lvert a_1-a_3 \rvert, a_1, a_2)\Rightarrow gcd(\lvert a_1-a_3 \rvert, gcd(a_1, a_2))\\\Rightarrow gcd(\lvert a_1-a_3 \rvert,gcd(a_1,\lvert a_1-a_2 \rvert))\Rightarrow gcd(\lvert a_1-a_3 \rvert,a_1,\lvert a_1-a_2 \rvert)\\\Rightarrow gcd(a_1,\lvert a_1-a_2 \rvert, \lvert a_1-a_3 \rvert) gcd(a1,a2,a3)gcd(a2,a1,a3)gcd(a2,gcd(a1,a3))gcd(a2,gcd(a1,a1a3))gcd(a2,a1,a1a3)gcd(a1a3,a1,a2)gcd(a1a3,gcd(a1,a2))gcd(a1a3,gcd(a1,a1a2))gcd(a1a3,a1,a1a2)gcd(a1,a1a2,a1a3)
根据上面的过程,我们可以得到 g c d ( a 1 + b 1 , a 2 + b 1 , a 3 + b 1 , . . . , a n + b 1 ) ⇒ g c d ( a 1 + b 1 , ∣ a 1 + b 1 − a 2 − b 1 ∣ , ∣ a 1 + b 1 − a 3 − b 1 ∣ , . . . , ∣ a 1 + b 1 − a n − b 1 ∣ ) ⇒ g c d ( a 1 + b 1 , ∣ a 1 − a 2 ∣ , ∣ a 1 − a 3 ∣ , . . . , ∣ a 1 − a n ∣ ) ⇒ g c d ( a 1 + b 1 , g c d ( ∣ a 1 − a 2 ∣ , ∣ a 1 − a 3 ∣ , . . . , ∣ a 1 − a n ∣ ) ) gcd(a_1+b_1, a_2+b_1, a_3+b1, ..., a_n+b_1)\Rightarrow gcd(a_1+b_1, \lvert a_1+b_1-a_2-b_1 \rvert, \lvert a_1+b_1-a_3-b_1 \rvert,..., \lvert a_1+b_1-a_n-b_1 \rvert)\Rightarrow gcd(a_1+b_1, \lvert a_1-a_2 \rvert, \lvert a_1-a_3 \rvert,..., \lvert a_1-a_n \rvert)\Rightarrow gcd(a_1+b_1, gcd(\lvert a_1-a_2 \rvert, \lvert a_1-a_3 \rvert,..., \lvert a_1-a_n \rvert)) gcd(a1+b1,a2+b1,a3+b1,...,an+b1)gcd(a1+b1,a1+b1a2b1,a1+b1a3b1,...,a1+b1anb1)gcd(a1+b1,a1a2,a1a3,...,a1an)gcd(a1+b1,gcd(a1a2,a1a3,...,a1an))。因为根据数据输入,我们是先得到 a i a_i ai,因此我们可以先计算 g c d ( ∣ a 1 − a 2 ∣ , ∣ a 1 − a 3 ∣ , . . . , ∣ a 1 − a n ∣ ) gcd(\lvert a_1-a_2 \rvert, \lvert a_1-a_3 \rvert,..., \lvert a_1-a_n \rvert) gcd(a1a2,a1a3,...,a1an),然后再计算最终的结果。

数据范围分析

根据题目给出的数据,需要使用 long long。

AC 代码

//https://codeforces.com/contest/1458/problem/A
//A. Row GCD
#include <bits/stdc++.h>

using namespace std;

//如果提交到OJ,不要定义 __LOCAL
//#define __LOCAL

typedef long long ll;
const int MAXN=2e5+4;
ll a[MAXN], b[MAXN];

int main() {
    
    
#ifndef __LOCAL
    //这部分代码需要提交到OJ,本地调试不使用
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
#endif
    int n,m;
    cin>>n>>m;
    for (int i=1; i<=n; i++) {
    
    
        cin>>a[i];
    }

    ll g=0;
    for (int i=2; i<=n; i++) {
    
    
        g=__gcd(g, abs(a[i]-a[i-1]));
    }

    for (int i=1; i<=m; i++) {
    
    
        cin>>b[i];
        ll ans=__gcd(a[1]+b[i], g);
        cout<<ans<<" ";
    }

    cout<<"\n";

#ifdef __LOCAL
    //这部分代码不需要提交到OJ,本地调试使用
    system("pause");
#endif
    return 0;
}

在这里插入图片描述

时间复杂度

O ( m a x ( n , m ) ) O(max(n, m)) O(max(n,m))

空间复杂度

O ( m a x ( n , m ) ) O(max(n, m)) O(max(n,m))

猜你喜欢

转载自blog.csdn.net/justidle/article/details/112252780
今日推荐