Codeforces Round #552:G. Minimum Possible LCM

 官方题解是时间复杂度为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;
}

猜你喜欢

转载自www.cnblogs.com/clno1/p/10761283.html
今日推荐