唉!!惨淡~~
题面:
题解:这道题,比赛马上结束的时候知道怎么写了....,但是码力不够,实现不了...
对每个数分解质因子,考虑质因子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; }
打比赛心态一定要好,继续加油吧!!!