题目解析
* 输入输出:第一行输入整数 ttt 表示测试用例组数。每组测试用例包含两行:第一行为正整数 nnn,第二行为 nnn 个正整数组成的序列。对于每组数据,输出 Yes 表示存在某个元素是序列中所有数的倍数,否则输出 No。
* 数据范围:1≤t≤101 \le t \le 101≤t≤10,1≤n≤1051 \le n \le 10^51≤n≤105,1≤ai≤1091 \le a_i \le 10^91≤ai ≤109。注意多组数据总和可能达到 10610^6106 量级。
* 复杂度要求:单组数据需要 O(n)O(n)O(n) 时间处理,总时间复杂度 O(t⋅n)≤106O(t \cdot n) \le 10^6O(t⋅n)≤106,空间复杂度 O(n)O(n)O(n)。
* 算法知识点:数学观察、最大元素性质、整除判定
思路解析
1. 关键观察:若存在某个 aia_iai 是序列中所有数的倍数,则 aia_iai 必须是序列中的最大值。因为作为所有数的倍数,aia_iai 必须满足 ai≥aka_i \ge a_kai ≥ak 对所有 kkk 成立,故只能是最大值。
2. 验证策略:取出序列中的最大值 max_val\textit{max\_val}max_val,遍历检查 max_val\textit{max\_val}max_val 是否能被序列中每一个数整除(即 max_val mod ak=0\textit{max\_val} \bmod a_k = 0max_valmodak =0)。
3. 边界处理:当 n=1n=1n=1 时,唯一元素自然是所有数(自身)的倍数,直接满足条件。
4. 复杂度分析:使用 max_element O(n)O(n)O(n) 找最大值,再 O(n)O(n)O(n) 验证整除性,单组数据复杂度 O(n)O(n)O(n)。
完整代码