HDU 6025(思维)
题面:
Total Submission(s): 1964 Accepted Submission(s): 926
Coprime Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1964 Accepted Submission(s): 926
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个数,让你删除一个数,使得所有数的gcd最大。
题目分析:这是一道挺有意思的思维题。首先我们要知道,求n个数的gcd与求取的顺序没有影响。而要求出删除一个数之后的最大gcd,我们可以考虑采取某种策略使得某一位取不到。于是,我们可以发现可以采取统计前后缀的gcd,然后通过前后缀的交错求出去除掉某位数之后的gcd,然后统计最大值即可。
代码如下:
#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int gcda[maxn],gcdb[maxn];
int a[maxn];
int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
gcda[1]=a[1];
gcdb[n]=a[n];
for(int i=2;i<=n;i++){
gcda[i]=gcd(gcda[i-1],a[i]);
}
for(int i=n-1;i>=1;i--){
gcdb[i]=gcd(gcdb[i+1],a[i]);
}
int maxx=0;
for(int i=1;i<=n;i++){
if(i==1) maxx=max(maxx,gcdb[i+1]);
else if(i==n) maxx=max(maxx,gcda[i-1]);
else maxx=max(maxx,gcd(gcda[i-1],gcdb[i+1]));
}
cout<<maxx<<endl;
}
}