Coprime Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2181 Accepted Submission(s): 1019
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
331 1 152 2 2 3 241 2 4 8
Sample Output
122
Source
题意:给你n个数,求去掉任意一个数后剩下数的最大GCD。
三个for循环:
1、for 1~n 前缀GCD qian[i]
2、for n~1 后缀GCD hou[i]
3、for 1~n max(GCD(qian[i-1],hou[i+1]));
我当时傻傻的用2000+b的RMQ也搞过去了,写的超级麻烦,醉。
AC代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#define ll long long
using namespace std;
ll gcd(ll x,ll y)
{
if(y==0) return x;
else return gcd(y,x%y);
}
ll a[100005],b[100005];
ll c[100005];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ll n;
ll t;
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&c[i]);
}
t=c[1];
for(int i=1;i<=n;i++)
{
t=gcd(t,c[i]);
a[i]=t;
}
t=c[n];
for(int i=n;i>=1;i--)
{
t=gcd(t,c[i]);
b[i]=t;
}
ll maxn=max(b[2],a[n-1]);
for(int i=2;i<=n-1;i++)
{
maxn=max(maxn,gcd(a[i-1],b[i+1]));
}
cout<<maxn<<endl;
}
}