# 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),即为答案