Coprime Sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 3065    Accepted Submission(s): 1424


 

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,所以求出每个数前面元素的GCD和后面元素的GCD,在对着两个值求一遍GCD就能得到删去这个数后的GCD了,取出最大值即可。

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<set>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define closeio std::ios::sync_with_stdio(false)
#define maxn 100005

int gcd1[maxn],gcd2[maxn];
int a[maxn];

int main()
{
	int t,n,i;
	cin>>t;
	while(t--)
	{
		cin>>n;
		gcd1[0]=gcd2[n+1]=0;
		for(i=1;i<=n;i++)
		{
			cin>>a[i];
			if(i==1)
				gcd1[i]=a[i];
			else
				gcd1[i]=__gcd(gcd1[i-1],a[i]);
		}
		for(i=n;i>=1;i--)
		{
			if(i==n)
				gcd2[i]=a[n];
			else
				gcd2[i]=__gcd(gcd2[i+1],a[i]);
		}
		int minn=-inf;
		for(i=1;i<=n;i++)
		{
			minn=max(minn,__gcd(gcd1[i-1],gcd2[i+1]));
		}
		cout<<minn<<endl;
	}
	return 0;
}