寻找倍数
这道题目考察的是数论基础和逻辑推理。虽然题目看起来需要两两比较,但通过分析可以极大地简化算法。
题目分析
核心问题:
我们需要在数组 AAA 中找到一个数 aia_iai ,使得 aia_iai 是数组中所有数的倍数。
用数学语言描述:是否存在 aia_iai ,使得对于所有的 kkk (1≤k≤n1 \le k \le n1≤k≤n),都有 ai(modak)=0a_i \pmod{a_k} = 0ai (modak )=0。
关键推理:
假设数组中满足条件的数是 XXX。
1. 既然 XXX 是数组中所有数的倍数,那么 XXX 一定也是数组中最大值(记为 MaxMaxMax)的倍数。
2. 如果 XXX 是 MaxMaxMax 的倍数,那么必然有 X≥MaxX \ge MaxX≥Max。
3. 但是,MaxMaxMax 本身就是数组中最大的数,数组里不可能有比 MaxMaxMax 还大的数。
4. 所以,XXX 只能等于 MaxMaxMax。
结论:
我们不需要检查数组里的每一个数。只需要检查数组中的最大值,看它是否能被数组里所有的数整除即可。
* 如果最大值能被所有数整除,输出 Yes。
* 否则,输出 No。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
解题步骤
1. 读取数据:首先读取测试用例组数 ttt。
2. 处理每组数据:
* 读取 nnn。
* 读取 nnn 个整数,并在读取过程中找出最大值 (max_val)。
3. 验证条件:
* 遍历数组中的每一个数 num。
* 检查 max_val % num 是否等于 0。
* 如果发现有一个数不能整除 max_val,说明条件不满足,标记为失败。
4. 输出结果:根据检查结果输出 Yes 或 No。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C++ 代码实现
样例验证
输入 #1
执行过程:
1. 第一组:数组 [1, 2, 4]。
* 最大值是 4。
* 检查:4 % 1 == 0 (OK), 4 % 2 == 0 (OK), 4 % 4 == 0 (OK)。
* 全部通过,输出 Yes。
2. 第二组:数组 [1, 2, 3, 4, 5]。
* 最大值是 5。
* 检查:5 % 1 == 0 (OK), 5 % 2 != 0 (Fail)。
* 发现不能整除,输出 No。
结果与题目样例一致。