1 条题解

  • 2
    @ 2025-11-24 10:10:14

    分类讨论整个数组的最小值在 min 的部分还是 gcd 的部分:

    1.最小值在 min 的部分

    此时要求 gcd 等于最小值,显然 gcd 的部分每个数都是最小值的倍数,考虑贪心,把所有的最小值的倍数(除了一个最小值以外)都放到后面,其他数都放在前面,判断 gcd 是否等于最小值即可,感性理解贪心的正确性:增加一个数肯定不会使 gcd 增大,同时保证了所有数都是最小值的倍数,所以正确。

    2.最小值在 gcd 的部分

    此时若有一个最小值在 min 则可以归纳到上一种情况,否则 min 的部分的值一定大于最小值,gcd 的值一定小于等于最小值,所以此时无解。

    综上所述,最小值一定有至少一个在 min 的部分,所以两侧的值一定都是最小值。

    判断是否存在一些序列中的数使得 gcd 等于最小值即可。

    #include <bits/stdc++.h>
    using namespace std;
    long long t, n, a[200005], i, g;
    int main()
    {
        ios::sync_with_stdio(0);
        cin.tie(0);
        cin >> t;
        while (t--)
        {
            cin >> n;
            for (i = 1; i <= n; i++)
                cin >> a[i];
            sort(a + 1, a + n + 1);
            g = 0;
            for (i = 2; i <= n; i++)
                if (a[i] % a[1] == 0)
                    g = __gcd(g, a[i]);
            if (g > a[1] || g == 0)
                cout << "NO\n";
            else
                cout << "YES\n";
        }
    }
    

    信息

    ID
    1209
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    35
    已通过
    6
    上传者