Files
python/GESP/Level5/GESP202506/T2.md
HuangHai 6cd42b8ec2 'commit'
2025-09-21 15:19:06 +08:00

1.8 KiB
Raw Blame History

GESP202506 第2题题解

一、题目描述

1.1 问题大意

给定n个正整数a₁,a₂,…,aₙ以及q组询问。对于每组询问i1≤i≤q请输出gcd(a₁+i,a₂+i,…,aₙ+i)的值也就是所有数加上i后的最大公约数。

1.2 输入格式

第一行两个正整数n和q分别表示给定正整数的数量以及询问的组数。 第二行n个正整数a₁,a₂,…,aₙ。 接下来q行每行包含一个正整数i表示每组询问的参数。

1.3 输出格式

输出q行每行包含一个正整数表示第i组询问对应的所有数加i后的最大公约数。

二、解题思路

2.1 数学原理

这道题的关键在于利用一个重要的数学性质:

对于任意正整数x gcd(a₁+x, a₂+x, ..., aₙ+x) = gcd(gcd(a₂-a₁, a₃-a₁, ..., aₙ-a₁), a₁+x)

这个性质的证明如下:

  • 设d = gcd(a₁+x, a₂+x, ..., aₙ+x)
  • 则d整除(a₂+x)-(a₁+x) = a₂-a₁同理d整除a₃-a₁, ..., aₙ-a₁
  • 因此d整除gcd(a₂-a₁, a₃-a₁, ..., aₙ-a₁)
  • 同时d整除a₁+x
  • 所以d整除gcd(gcd(a₂-a₁, a₃-a₁, ..., aₙ-a₁), a₁+x)
  • 反过来设g = gcd(gcd(a₂-a₁, a₃-a₁, ..., aₙ-a₁), a₁+x)
  • 则g整除a₁+x且g整除所有的a_i-a₁
  • 因此g整除(a₁+x)+(a_i-a₁) = a_i+x对所有i成立
  • 所以g整除gcd(a₁+x, a₂+x, ..., aₙ+x)
  • 综上,两者相等

2.2 算法思路

    首先对数组a进行排序排序不是必须的但有助于理解算法
    计算所有相邻元素差的GCD记为g
    • 实际上根据数学性质只需要计算所有元素与第一个元素差的GCD
    • 但计算相邻元素差的GCD可以更高效地得到相同的结果
    对于每个查询x计算gcd(g, a[1]+x),即为答案