Coprime Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 72 Accepted Submission(s): 51
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
Source
2017中国大学生程序设计竞赛 - 女生专场
Recommend
jiangzijing2015 | We have carefully selected several similar problems for you: 6032 6031 6030 6029 6028
题意就不多说了,作为菜鸡看到如此做法我一定要发表一下;
不多BB,看代码:
#include
#include
#include
using namespace std;
int a[100005];//a[i]表示1到i所有数的GCD
int b[100005];//b[i]表示i到n所有数的GCD
int s[100005];
int gcd(int a,int b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s[i];
if(i==1)
{
a[i]=s[i];
continue;
}
if(i==n)
b[i]=s[i];
a[i]=gcd(a[i-1],s[i]);
}
for(int i=n-1;i>=1;i--)
b[i]=gcd(b[i+1],s[i]);
int ans=1;
for(int i = 1; i <= n; ++i)
{
if(i == 1)
ans=max(ans,b[2]);
else if(i == n)
ans=max(ans,a[n - 1]);
else
ans = max(ans, gcd(a[i - 1],b[i + 1]));
}
cout< }
}