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.
``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.
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
Source
Recommend
jiangzijing2015 | We have carefully selected several similar problems for you:
6032
6031
6030
6029
6028
题意就不多说了,作为菜鸡看到如此做法我一定要发表一下;
不多BB,看代码:
#include<iostream>
#include<cstring>
#include<stdio.h>
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<<ans<<endl;
}
}
#include<cstring>
#include<stdio.h>
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<<ans<<endl;
}
}