题意:
给你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;
}