官方题解是时间复杂度为O(nd)的。这里给出一个简单实现但是时间复杂度为O(NlogN) (N=1e7)
因为 a*b/gcd(a,b)=lcm(a,b) 所以我们可以枚举每一个因子,然后找到存在这个因子的 最小的两个数(只要最小的两个即可,因为后面较大数的数的lcm肯定会比较小的两个数的lcm大)。
在这些答案中取最小的即可。
代码实现也十分简洁:
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e7+10; int n,a[N],c[N]; vector<int> v; int main() { cin>>n; LL ans=1LL<<60,r1,r2; for (int i=1;i<=n;i++) { scanf("%d",&a[i]); if (!c[a[i]]) c[a[i]]=i; else if (a[i]<ans) { ans=a[i]; r1=c[a[i]]; r2=i; } } for (int i=1;i<N;i++) { v.clear(); for (int j=i;j<N;j+=i) { if (c[j]) v.push_back(j); if (v.size()>=2) break; } if (v.size()<2) continue; LL tmp=(LL)v[0]*v[1]/i; if (tmp<ans) { ans=tmp; r1=c[v[0]]; r2=c[v[1]]; } } if (r1>r2) swap(r1,r2); cout<<r1<<" "<<r2<<endl; return 0; }