清北學堂day3

T1 gcdlcm

 

用cnt[i]記錄i出現了多少次,枚舉約數d,檢查cnt[j*d] (j*d<=maxn),用f,g記錄最大值和次大值;ios

cnt[j*d]>=2,則fg都更新爲j*dspa

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

f>0,g>0,則答案更新爲f*g/d;blog

注:若fg相同,因爲上面的d會枚舉到,因此不會影響答案;string

code:io

 

#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;
}
相關文章
相關標籤/搜索