题解
2026-02-26 12:59:21
发布于:浙江
23阅读
0回复
0点赞
题目解析
- 输入输出:第一行输入整数 表示测试用例组数。每组测试用例包含两行:第一行为正整数 ,第二行为 个正整数组成的序列。对于每组数据,输出
Yes表示存在某个元素是序列中所有数的倍数,否则输出No。 - 数据范围:,,。注意多组数据总和可能达到 量级。
- 复杂度要求:单组数据需要 时间处理,总时间复杂度 ,空间复杂度 。
- 算法知识点:
数学观察、最大元素性质、整除判定
思路解析
- 关键观察:若存在某个 是序列中所有数的倍数,则 必须是序列中的最大值。因为作为所有数的倍数, 必须满足 对所有 成立,故只能是最大值。
- 验证策略:取出序列中的最大值 ,遍历检查 是否能被序列中每一个数整除(即 )。
- 边界处理:当 时,唯一元素自然是所有数(自身)的倍数,直接满足条件。
- 复杂度分析:使用
max_element找最大值,再 验证整除性,单组数据复杂度 。
完整代码
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10; // 根据数据范围上限开数组
int arr[MAXN];
void solve() {
int n;
// 多组测试用例,清空数组避免残留数据干扰
memset(arr, 0, sizeof(arr));
cin >> n;
for(int i = 0; i < n; i++) {
cin >> arr[i];
}
// 找出最大值:只有最大值可能是"所有数的倍数"
int max_val = *max_element(arr, arr + n);
// 验证该最大值能否被所有数整除
for(int i = 0; i < n; i++) {
// 关键判断:若存在不能整除的情况(余数非0),则不存在满足条件的数
if (max_val % arr[i] != 0) {
cout << "No" << endl;
return; // 提前退出,无需继续检查
}
}
cout << "Yes" << endl;
}
int main() {
int t;
cin >> t;
// 循环处理 t 组测试用例
while(t--) solve();
return 0;
}
这里空空如也

有帮助,赞一个