我们需要判断序列 A 中是否存在一个元素 ai,满足 ai 是序列里所有数的倍数。换句话说,对于所有的 ak,都有 aimodak=0。
因为序列中的数都是正整数,所以满足条件的 ai 必须不小于序列中的任何一个数。否则,若存在某个 ak>ai,那么 ai 就不可能是 ak 的倍数。由此可知,符合条件的 ai 必定是序列的最大值。
因此问题转化为:检查序列的最大值是否能整除序列中的每一个数。
对于每组测试数据:
Yes;否则输出 No。No 并结束本组测试。对于每组测试用例,我们需要 O(n) 的时间找出最大值并进行整除检查。共有 t 组数据,因此总时间复杂度为 O(t×n)。题目中 t≤10,n≤105,可以轻松通过。
cpp1#include <bits/stdc++.h> 2using namespace std; 3 4const int N = 1e5 + 10; 5int a[N]; 6 7int main() { 8 int t; 9 cin >> t; 10 while (t--) { 11 int n; 12 cin >> n; 13 int mx = 0; 14 15 // 读入序列并找出最大值 16 for (int i = 1; i <= n; i++) { 17 cin >> a[i]; 18 mx = max(mx, a[i]); 19 } 20 21 bool bad = false; 22 // 检查最大值是否能整除所有数 23 for (int i = 1; i <= n; i++) { 24 if (mx % a[i] != 0) { 25 bad = true; 26 break; 27 } 28 } 29 30 if (bad) 31 cout << "No\n"; 32 else 33 cout << "Yes\n"; 34 } 35 36 return 0; 37}
mx 用于存放序列的最大值,在读入时同时更新。bad 标记是否出现不整除的情况。mx % a[i] != 0,说明最大值不是 ai 的倍数,直接置 bad = true 并跳出循环。bad 的值输出对应的答案。该代码简洁高效,与题目分析中的思路完全一致。