题意:给你一串数,要求删除其中任意一个使得总gcd最大
思路:求前缀gcd和后缀gcd。然后枚举每一个数,求每一个数的前缀gcd与后缀gcd的gcd,取最大值
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 10;
int a[maxn];
int fronts[maxn], behinds[maxn];
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
int main()
{
int T, n; scanf("%d", &T);
while (T--) {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
fronts[1] = a[1];
for (int i = 2; i <= n; i++) {
fronts[i] = gcd(fronts[i - 1], a[i]);
}
behinds[n] = a[n];
for (int i = n - 1; i >= 1; i--) {
behinds[i] = gcd(behinds[i + 1], a[i]);
}
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = max(ans, gcd(fronts[i - 1], behinds[i + 1]));
}
printf("%d\n", ans);
}
return 0;
}