清北学堂day3

2019-11-04 09:32:04来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

清北学堂day3

T1 gcdlcm

 

用cnt[i]记录i出现了多少次,枚举约数d,检查cnt[j*d] (j*d<=maxn),用f,g记录最大值和次大值;

cnt[j*d]>=2,则fg都更新为j*d

cnt[j*d]==1g=f,f=j*d;

f>0,g>0,则答案更新为f*g/d;

注:若fg相同,由于上面的d会枚举到,所以不会影响答案;

code:

 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e6+100;
typedef long long ll;
int cnt[N],a[N],n,maxn,f,g;
ll ans;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]),cnt[a[i]]++,maxn=max(maxn,a[i]);
    for(int d=1;d<=maxn;d++){
            f=0,g=0;
        for(int j=1;1ll*j*d<=maxn;j++){
            if(cnt[j*d]>=2){
                f=1ll*j*d;g=1ll*j*d;
            }else if(cnt[j*d]==1){
                g=f;f=1ll*j*d;
            }
        }
        if(f>0&&g>0){
         ans=1ll*f*g/d;
        }
    }
    printf("%lld",ans);
    return 0;
}

 


原文链接:https://www.cnblogs.com/zmzx-xrx/p/11791348.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:C++贪心算法实现活动安排问题

下一篇:多重背包问题