Coprime Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 2938 Accepted Submission(s): 1356
Problem Description Do you know what is called ``Coprime Sequence''? That is a sequence consists of n positive integers, and the GCD (Greatest Common Divisor) of them is equal to 1. ``Coprime Sequence'' is easy to find because of its restriction. But we can try to maximize the GCD of these integers by removing exactly one integer. Now given a sequence, please maximize the GCD of its elements. Input The first line of the input contains an integer T(1≤T≤10) , denoting the number of test cases. In each test case, there is an integer n(3≤n≤100000) in the first line, denoting the number of integers in the sequence. Then the following line consists of n integers a1,a2,...,an(1≤ai≤109) , denoting the elements in the sequence. Output For each test case, print a single line containing a single integer, denoting the maximum GCD. Sample Input 3 3 1 1 1 5 2 2 2 3 2 4 1 2 4 8 Sample Output 1 2 2 思路: 暴力,正序跟逆序都求一下gcd,在遍历一遍除去一个数求出最大gcd 代码: #include<bits/stdc++.h> using namespace std; const int maxn = (int)1e5 + 5; int a[maxn]; int l[maxn],r[maxn]; int gcd(int a,int b) { return b ? gcd(b,a % b) : a; } bool cmp(int a,int b) { return a > b; } int main() { int t; scanf("%d",&t); while (t --) { int n,ans = 1,temp; scanf("%d",&n); for (int i = 0;i < n;i ++) scanf("%d",&a[i]); l[0] = a[0],r[n - 1] = a[n - 1]; for (int i = 1;i < n;i ++) l[i] = gcd(l[i - 1],a[i]); for (int i = n - 2;i >= 0;i --) r[i] = gcd(a[i],r[i + 1]); ans = max(l[n - 2],r[1]); for (int i = 1;i <= n - 1;i ++) { ans = max(ans,gcd(l[i - 1],r[i + 1])); } printf("%d\n",ans); } return 0; } |