Coprime Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2336 Accepted Submission(s): 1075
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
题意:输入n个数,随便删除一个数,求剩余n-1个数的最大公约数,问删除一个数后最大的最大公约数是几。
思路:依次从左边求开始出前i个数的GCD,在依次从右边开始求出前j个数的GCD。再一次模拟删除任意一个数,求剩余n-1个数的GCD,从其中去最大的GCD。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int GCD(int a,int b) { return b==0?a:GCD(b,a%b); } int main() { int t; cin>>t; while(t--) { int n; cin>>n; int a[n+1]; for(int i=1;i<=n;i++) cin>>a[i]; int pre[n+1],ends[n+1],mid[n+1]; pre[1]=a[1]; for(int i=2;i<=n;i++) pre[i]=GCD(pre[i-1],a[i]); ends[n]=a[n]; for(int i=n-1;i>=1;i--) ends[i]=GCD(ends[i+1],a[i]); int Max=max(pre[n-1],ends[2]);///比较是删除第一个数还是删除最后一个数后剩余n-1个数的GCD最大 for(int i=2;i<=n-1;i++) Max=max(Max,GCD(pre[i-1],ends[i+1]));///删除2~n-1中的一个数的GCD cout<<Max<<endl; } return 0; }