C. Orac and LCM(数论)
可以推出
求 可以用后缀数组维护一下 。
时间复杂度:
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long ll;
ll suf[N],a[N];
ll gcd(ll x,ll y){
return y==0?x:gcd(y,x%y);
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=n;i>=1;i--) suf[i]=gcd(suf[i+1],a[i]);
ll ans=0;
for(int i=1;i<=n;i++) ans=gcd(ans,a[i]/gcd(suf[i+1],a[i])*suf[i+1]);
printf("%lld\n",ans);
return 0;
}
官方解法:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long ll;
ll pre[N],suf[N],a[N];
ll gcd(ll x,ll y){
return y==0?x:gcd(y,x%y);
}
int main(){
int n;
scanf("%d",&n);
scanf("%lld",&a[1]);pre[1]=a[1];
for(int i=2;i<=n;i++) scanf("%lld",&a[i]),pre[i]=gcd(pre[i-1],a[i]);
suf[n]=a[n];
for(int i=n-1;i>=1;i--) suf[i]=gcd(suf[i+1],a[i]);
ll ans=1;
for(int i=1;i<=n;i++){
if(i==1) ans=suf[2];
else if(i==n) ans=ans/gcd(ans,pre[i-1])*pre[i-1];
else {
ll x=gcd(pre[i-1],suf[i+1]);
ans=ans*x/gcd(x,ans);
}
}
printf("%lld\n",ans);
return 0;
}