#include <bits/stdc++.h>
using namespace std;
// 获取一个数的所有因数(包含1和自身)
vector<int> getDivisors(int x) {
vector<int> divisors;
// 遍历到平方根以优化因数查找效率
for (int i = 1; i * i <= x; ++i) {
if (x % i == 0) { // 发现因数i
divisors.push_back(i);
if (i != x / i) { // 避免重复添加平方根的情况
divisors.push_back(x / i); // 对应的另一个因数
}
}
}
return divisors;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
vector<int> H(n);
// 读取所有宝石的闪亮度
for (int i = 0; i < n; ++i) {
cin >> H[i];
}
// 统计每个因数出现的次数(用于寻找最大公约数候选)
unordered_map<int, int> cnt;
// 遍历所有宝石
for (int x : H) {
// 获取当前宝石的所有因数
vector<int> divisors = getDivisors(x);
// 每个因数出现次数+1
for (int d : divisors) {
cnt[d]++;
}
}
// 收集所有可能的公约数候选
vector<int> uniqueD;
for (const auto& kv : cnt) {
uniqueD.push_back(kv.first);
}
// 将候选因数按降序排列,优先处理大的因数
sort(uniqueD.begin(), uniqueD.end(), greater<int>());
// 遍历所有候选因数
for (int d : uniqueD) {
// 需要至少三个数包含这个因数
if (cnt[d] >= 3) {
vector<int> candidates;
// 收集所有能被d整除的宝石
for (int x : H) {
if (x % d == 0) {
candidates.push_back(x);
}
}
// 需要至少三个候选才能形成组合
if (candidates.size() >= 3) {
// 排序确保字典序最小
sort(candidates.begin(), candidates.end());
// 输出前三个最小的候选
cout << candidates[0] << " " << candidates[1] << " " << candidates[2] << '\n';
return 0; // 找到最优解后立即退出
}
}
}
// 备用方案:当没有符合条件的因数时(理论上不会触发)
vector<int> sortH = H;
sort(sortH.begin(), sortH.end());
// 输出全局最小的三个数(字典序保证)
cout << sortH[0] << " " << sortH[1] << " " << sortH[2] << '\n';
return 0;
}
0 回复
0 转发
0 喜欢
1 阅读



