枚举,预处理。
预处理前缀$gcd$与后缀$gcd$,枚举删哪一个即可。
#include <bits/stdc++.h> using namespace std; int T,n; long long a[100010]; long long L[100010]; long long R[100010]; long long gcd(long long a,long long b) { if(b==0) return a; return gcd(b,a%b); } int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); } for(int i=1;i<=n;i++) { L[i] = gcd(L[i-1],a[i]); } for(int i=n;i>=1;i--) { R[i] = gcd(R[i+1],a[i]); } long long ans=0; for(int i=1;i<=n;i++) { ans=max(ans,gcd(L[i-1],R[i+1])); } printf("%lld ",ans); } return 0; }