1 条题解

  • 0
    @ 2026-5-19 20:36:38

    A. Kamilka and the Sheep 详细题解

    一、问题重述

    nn 只羊,每只羊有初始美貌值 aia_i(互不相同)。你可以选择一个非负整数 dd,使每只羊的美貌值增加 dd。然后选择两只羊,其美貌值为 xxyy,愉悦度为 gcd(x,y)\gcd(x, y)。求最大可能的愉悦度。


    二、核心观察

    2.1 关键公式

    对于任意两个正整数 x<yx < y,有:

    gcd(x,y)=gcd(x,yx)\gcd(x, y) = \gcd(x, y - x)

    因此 gcd(x,y)\gcd(x, y) 不会超过 yxy - x

    2.2 上界分析

    设最终选择的两只羊的美貌值(加上 dd 后)为 xxyyx<yx < y),则:

    $$\gcd(x, y) \le y - x \le (\max(a_i) + d) - (\min(a_i) + d) = \max(a_i) - \min(a_i) $$

    所以最大可能的愉悦度不可能超过 max(ai)min(ai)\max(a_i) - \min(a_i)

    2.3 构造达到上界

    d=(min(ai))mod(max(ai)min(ai))d = (-\min(a_i)) \bmod (\max(a_i) - \min(a_i)),即:

    $$d = \left( \max(a_i) - \min(a_i) - \min(a_i) \bmod (\max(a_i) - \min(a_i)) \right) \bmod (\max(a_i) - \min(a_i)) $$

    更简单:选择 dd 使得 min(ai)+d\min(a_i) + dmax(ai)min(ai)\max(a_i) - \min(a_i) 的倍数。

    m=max(ai)min(ai)m = \max(a_i) - \min(a_i)。令 d=m(min(ai)modm)d = m - (\min(a_i) \bmod m),则:

    • min(ai)+d\min(a_i) + dmm 的倍数
    • max(ai)+d=min(ai)+m+d\max(a_i) + d = \min(a_i) + m + d 也是 mm 的倍数

    因此:

    gcd(min(ai)+d,max(ai)+d)=m\gcd(\min(a_i) + d, \max(a_i) + d) = m

    即可以达到上界 max(ai)min(ai)\max(a_i) - \min(a_i)


    三、结论

    答案即为:

    max(ai)min(ai)\boxed{\max(a_i) - \min(a_i)}

    四、标程代码

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int n;
        cin >> n;
        vector<int> a(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        sort(a.begin(), a.end());
        cout << a[n - 1] - a[0] << '\n';
    }
    
    int main() {
        ios_base::sync_with_stdio(false);
        cin.tie(0);
        int tt;
        cin >> tt;
        while (tt--) {
            solve();
        }
        return 0;
    }
    

    五、示例验证

    示例 1:[1,3][1, 3]

    • maxmin=2\max - \min = 2,输出 22

    示例 2:[5,4,3,2,1][5,4,3,2,1]

    • maxmin=51=4\max - \min = 5 - 1 = 4,输出 44

    示例 3:[5,6,7][5,6,7]

    • maxmin=2\max - \min = 2,输出 22

    示例 4:[1,11,10][1,11,10]

    • maxmin=111=10\max - \min = 11 - 1 = 10,输出 1010

    六、复杂度分析

    • 排序 O(nlogn)O(n \log n)n100n \le 100,完全可行
    • 也可直接找最大值和最小值 O(n)O(n)

    七、总结

    这道题的关键是利用 gcd(x,y)=gcd(x,yx)\gcd(x, y) = \gcd(x, y - x) 得到上界 max(a)min(a)\max(a) - \min(a),然后通过构造 dd 证明这个上界可以达到。因此答案非常简单:最大值与最小值的差

    • 1

    信息

    ID
    7274
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者