G. Minimum Possible LCM
题意:求 个数中最小公倍数数值最小的两个数的下标。
题解:参考于https://blog.csdn.net/qq_41157137/article/details/89353527,因为
对于包含
的数
如果
是
的最大公因数,那么
一定小于
,剩下亦是如此;
如果
不是
的最大公因数,那么
也一定小于
,如果
是
的最大公因数,同样满足
。
所以综上所述,只需要枚举最大公因数 ,然后取包含前两项的 并且最后取 即可。
代码
#include<bits/stdc++.h>
#define DEBUG(x) std::cerr << #x << '=' << (x) << std::endl
typedef long long LL;
using namespace std;
constexpr int N = 1E7+10;
int pos[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
#endif
ios::sync_with_stdio(false); cin.tie(nullptr);
int n, v, xi = 0, yi = 0;
cin >> n;
LL ret = LLONG_MAX;
for(int i = 1; i <= n; ++i) {
cin >> v;
if(pos[v] && v < ret) {
ret = v; //相同的数lcm肯定就是本身啦
xi = pos[v];
yi = i;
}
pos[v] = i;
}
for(int d = 1; d < N; ++d) {
for(int x = 0, y = d; y < N; y += d) {
if (pos[y]) { //因子包含d的数
if (x == 0) { x = y; }
else if (ret > 1LL * x * y / d) ret = 1LL * x * y / d, xi = pos[x], yi = pos[y];
}
}
}
if(xi > yi) swap(xi, yi);
cout << xi << ' ' << yi << endl;
return 0;
}