G. Minimum Possible LCM
https://codeforces.com/contest/1154/problem/G
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e7+1; int a[N],pos[N][3];//pos【i】【j】表示数字i出现位置,j代表出现次数 int countt[N],ans1,ans2,p[N],C; ll M=1e18; inline int read(){ int sum=0; int x=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') x=0; ch=getchar(); } while(ch>='0'&&ch<='9') sum=(sum<<1)+(sum<<3)+(ch^48),ch=getchar(); return x?sum:-sum; } int main(){ ios::sync_with_stdio(false); int n=read(); //cin>>n; for(int i=1;i<=n;i++){ int x=read(); //cin>>x; a[x]++; if(countt[x]<2) pos[x][++countt[x]]=i;//记录位置,只要出现俩次就行了 } //暴力枚举存在因子 for(int i=1;i<N;i++){ //如果有俩因子:ans1=i*j,ans2=i*j(与前面j不一定相同) for(int j=1;i*j<N;j++){ while(a[i*j]&&C<2)//出现的就拿来用,减去存在次数(-1) a[i*j]--,p[++C]=j; if(C==2) break; } //更新最小值 if(C==2&&M>(ll )p[1]*p[2]*i) M=(ll)p[1]*p[2]*i,ans1=i*p[1],ans2=i*p[2]; while(C)//生成新的数则存在次数+1 a[i*p[C--]]++; } //找位置 如果俩个相同,则要输出不同位置, if(ans1==ans2) ans1=pos[ans1][1],ans2=pos[ans2][2]; else ans1=pos[ans1][1],ans2=pos[ans2][1]; if(ans1>ans2) swap(ans1,ans2); cout<<ans1<<" "<<ans2; return 0; }