YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

唉!!惨淡~~

题面:

 

 

 题解:这道题,比赛马上结束的时候知道怎么写了....,但是码力不够,实现不了...

对每个数分解质因子,考虑质因子p,设每一个元素都含有p,(不包含的话可以让p的个数为0),那么任意两个元素的LCM,p的个数一定是取多的那个,所以我们只要取p的第二小的元素就可以了,该怎么实现呢?可以用将每个元素分解后的质因子的个数放到vector中,如果当前质因子出现的次数等于n,那就取最小,如果当前质因子出现的次数为n-1,那就取最小的那个了(因为有一个元素对应的该质因子的个数为0),如果当前质因子的个数小于n-1,那就不用取该质因子了。

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+7;
ll arr[N];
vector<ll >ve[N];
ll p=0;
void fenjie(ll x){
    ll c=sqrt(x);
    for(ll i=2;i<=c;i++){
        if(x%i==0){
            p=max(p,i);
            ll cnt=0;
            while(x%i==0){
                x/=i;cnt++;
            }
            ve[i].push_back(cnt);
        }
    }
    if(x!=1){
        p=max(p,x);
        ve[x].push_back(1);
    }
}
ll ksm(ll x,ll y){
    ll res=1;
    while(y){
        if(y&1) res=res*x;
        x=x*x;
        y>>=1;
    }
    return res;
}
int main(){
    ll n,x;
    cin>>n;
    for(ll i=1;i<=n;i++){
        cin>>x;fenjie(x);
    }
    ll ans=1;
    for(ll i=2;i<=p;i++){
        if(ve[i].size()==n){
            sort(ve[i].begin(),ve[i].end());
            ans=ans*ksm(i,ve[i][1]);
        }
        else if(ve[i].size()==n-1){
            sort(ve[i].begin(),ve[i].end());
            ans=ans*ksm(i,ve[i][0]);
        }
    }
    cout<<ans<<endl;
    return 0;
} 

 打比赛心态一定要好,继续加油吧!!!

posted on 2020-05-13 15:17  Target--fly  阅读(160)  评论(0编辑  收藏  举报