1 条题解
-
2
分类讨论整个数组的最小值在 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"; } }
- 1
信息
- ID
- 1209
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 35
- 已通过
- 6
- 上传者