最大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 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; }
|