题意:
给一个互质序列,序列的gcd为1.
现在要删除一个数,问删除一个数之后序列的gcd最大值是多少输出最大值
思路:
求出前缀和后缀gcd,然后枚举每个数作为删除的数
用这个数左边的前缀gcd和这个数右边的后缀gcd
求两边的gcd取max就是答案
code:
#include<bits/stdc++.h>
using namespace std;
const int maxm=1e5+5;
int a[maxm];
int l[maxm],r[maxm];
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
signed main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
l[1]=a[1];
for(int i=2;i<=n;i++){
l[i]=gcd(l[i-1],a[i]);
}
r[n]=a[n];
for(int i=n-1;i>=1;i--){
r[i]=gcd(r[i+1],a[i]);
}
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,gcd(l[i-1],r[i+1]));
}
printf("%d\n",ans);
}
return 0;
}