杂题——最大gcd

最大gcd

题目描述

给定一个长度为n的数组a,你可以将其中的某个数字替换为任意一个其他数字(此操作只能执行一次,也可以不操作),请问最大可以使得整个数组的gcd为多少?

输入格式

第一行一个整数T表示测试用例个数。(1≤T≤1000)

对于每组测试用例:

第一行一个整数n(2≤n≤105)。

第二行n个整数表示数组a(1≤ai≤109)。

数据保证n≤106

输出格式

对于每组测试用例,输出一个整数表示答案。

输入样例1

1
2
3
4
5
6
7
8
9
4
3
61 40 2
7
92 68 20 54 14 33 82
3
39 88 18
2
57 75

输出样例1

1
2
3
4
2
2
3
75

思路

​ 略

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int M = 1e5 + 5;
const int p = 1e9 + 7;

int n;

int a[M];
int pre[M];
int last[M];

int gcd(int x, int y)
{
return (y == 0 ? x : gcd(y, x % y));
}

void solve()
{
cin >> n;

for (int i = 1; i <= n; i++)
cin >> a[i];

pre[1] = a[1];
last[n] = a[n];

for (int i = 2; i <= n; i++)
{
pre[i] = gcd(pre[i - 1], a[i]);
}

for (int i = n - 1; i >= 1; i--)
{
last[i] = gcd(last[i + 1], a[i]);
}

int ans = last[2];
for (int i = 2; i <= n - 1; i++)
{
ans = max(ans, gcd(pre[i - 1], last[i + 1]));
}
ans = max(ans, pre[n - 1]);
cout << ans << '\n';


}

int main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

int t = 1;
cin >> t;
while (t--)
solve();

return 0;
}