法1:公式法
法2:图解法
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int n, a[maxn], res[4];
multiset<int> t; //存储a值,便于统计
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
t.insert(a[i]);
}
for(int i = 1e5; i >= 1; i--) //从大到小遍历gcd
{
int cnt = 0;
for(int j = i; j <= 1e5+1 && cnt <= 2; j+=i) //从小到大遍历i的倍数,注意cnt收集到3就结束,不然既浪费时间又可能不是最大s
{
for(int k = 1; k <= t.count(j) && cnt <= 2; k++) //看看j值是否多次出现,可以尽可能使用,减小字典序,也注意cnt,不然后面的cnt==3就失去作用了(cnt >= 3才对)
{
res[++cnt] = j; //增加计数,保存答案
}
}
if(cnt == 3) //如果找到这个3长序列,结束gcd的遍历
{
break;
}
}
cout << res[1] << " " << res[2] << " " << res[3];
return 0;
}