zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    客户(项目)经理应具备那些基本心理素质
    js 添加数组 删除数组
    c# ifram 刷新父页面
    [转].Net ajax检测用户名是否重复
    js 自动执行方法
    js 层 分页显示选择用户名
    c# Cookie的操作
    c# 取IE地址值
    js 弹出层无刷新分页
    iframe 无边框
  • 原文地址:https://www.cnblogs.com/starve/p/10727149.html
Copyright © 2011-2022 走看看