Coprime Sequence
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.
``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.
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 8Sample Output
1 2 2
判断一个数列在去掉一个数后的最大GCD。
该数列的最大GCD是每个数的GCD,将原始数列以要去掉的数为界,分成前后两部分,求出每个部分的最大GCD,那么再求前后两部分的最大GCD,即为去掉该数后的数列的最大GCD。
这也是前缀GCD和后缀GCD的用法。
AC代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<deque>
#include<iostream>
using namespace std;
int con[100009];
int head_gcd[100009];
int tail_gcd[100009];
int gcd(int a, int b)
{
return !b ? a : gcd(b, a % b);
}
int main()
{
int t,i,p,j,n,ans;
scanf("%d",&t);
for(i=1; i<=t; i++)
{
scanf("%d",&n);
for(j=0; j<n; j++)
scanf("%d",&con[j]);
head_gcd[0]=con[0];
for(j=1; j<n; j++)
head_gcd[j]=gcd(head_gcd[j-1],con[j]);
tail_gcd[n-1]=con[n-1];
for(j=n-2; j>=0; j--)
tail_gcd[j]=gcd(tail_gcd[j+1],con[j]);
ans=max(head_gcd[n-2],tail_gcd[1]);
for(j=1; j<n-1; j++)
ans=max(ans,gcd(head_gcd[j-1],tail_gcd[j+1]));
printf("%d\n",ans);
}
return 0;
}