您的位置:首页 > 产品设计 > UI/UE

HDU6025 Coprime Sequence (思路题)

2017-07-12 17:52 274 查看

Coprime Sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

Total Submission(s): 785    Accepted Submission(s): 411

[align=left]Problem Description[/align]
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.
 

[align=left]Input[/align]
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.
 

[align=left]Output[/align]
For each test case, print a single line containing a single integer, denoting the maximum GCD.
 

[align=left]Sample Input[/align]

3
3
1 1 1
5
2 2 2 3 2
4
1 2 4 8

 

[align=left]Sample Output[/align]

1
2
2

 

[align=left]Source[/align]
2017中国大学生程序设计竞赛 - 女生专场

 

[align=left]Recommend[/align]
jiangzijing2015   |   We have carefully selected several similar problems for you:  6032 6031 6030 6029 6028

题意
n个数,最大公约数为一,求去掉一个数,求出最大公约数
思路
从左往右,找出前几个数的最大公约数  gleft[i]
从右往左,找出后几个数的最大公约数  gright[i]
遍历,去掉第i个数时,这最大公约数为gleft[i-1]+grigh[i+1]
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
const int maxn=100010;
using namespace std;
int g[maxn];
int gleft[maxn];
int gright[maxn];
int _gcd(int a,int b)
{
return a==0?b:_gcd(b%a,a);
}
int main()
{
int t,n,maxnn;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&g[i]);
if(i==1)
gleft[i]=g[i];
else
gleft[i]=_gcd(gleft[i-1],g[i]);
}
for(int i=n;i>0;i--)
{
if(i==n)
gright[i]=g[i];
else
gright[i]=_gcd(gright[i+1],g[i]);
}
maxnn=0;
for(int i=1;i<=n;i++)
{
if(i==1)
maxnn=max(maxnn, gright[2]);
else if(i==n)
maxnn=max(maxnn,gleft[n-1]);
else
maxnn=max(maxnn,_gcd(gleft[i-1], gright[i+1]));
}
printf("%d\n",maxnn);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息