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

40 lines
1.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# GESP202506 第2题题解
## 一、题目描述
### 1.1 问题大意
给定n个正整数a₁,a₂,…,aₙ,以及q组询问。对于每组询问i(1≤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 算法思路
1. 1.
首先对数组a进行排序(排序不是必须的,但有助于理解算法)
2. 2.
计算所有相邻元素差的GCD,记为g
- 实际上,根据数学性质,只需要计算所有元素与第一个元素差的GCD
- 但计算相邻元素差的GCD可以更高效地得到相同的结果
3. 3.
对于每个查询x,计算gcd(g, a[1]+x),即为答案