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; } }