Codeforces 1154 G Minimum Possible LCM —— 暴力

This way

题意:

给你n个数,让你找出两个数使得他们的lcm最小。

题解:

lcm(x,y)=x*y/gcd(x,y)
对于每个gcd找出两个最小的倍数即可。
时间复杂度1e7+1e7/2+1e7/3+…=nlogn

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e7+5;
ll a[N/10+5];
int pos[N];
int main()
{
    int n;
    scanf("%d",&n);
    ll ans=1e18;
    int p1,p2;
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        if(pos[a[i]]&&ans>a[i])
            ans=a[i],p1=pos[a[i]],p2=i;
        pos[a[i]]=i;
    }
    for(ll i=1;i<N;i++){
        ll v=0;
        for(ll j=i;j<N;j+=i){
            if(pos[j]){
                if(!v)
                    v=j;
                else
                    if(v*j/i<ans)
                        ans=v*j/i,p1=pos[v],p2=pos[j];
            }
        }
    }
    if(p1>p2)
        swap(p1,p2);
    printf("%d %d\n",p1,p2);
    return 0;
}

发布了554 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/tianyizhicheng/article/details/104512151