典型的用空间换取时间的思想 关键要理解多个数怎么算最小公倍数
用一个前缀 一个后缀 然后枚举去掉的点就可以了
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int a[100000+5]; int pre[100000+5],suf[100000+5]; int gcd(int a, int b) { while(b) { int c = a%b; a = b; b = c; } return a; } int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d",&a[i]); pre[0]=a[0]; for(int i=1; i<n; i++) { pre[i]=gcd(pre[i-1],a[i]); } suf[n-1]=a[n-1]; for(int i=n-2; i>=0; i--) { suf[i]=gcd(suf[i+1],a[i]); } int ans=max(suf[1],pre[n-2]); for(int i=1;i<n-1;i++) { ans=max(ans,gcd(pre[i-1],suf[i+1])); } printf("%d ",ans); } return 0; }