Coprime Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 3655 Accepted Submission(s): 1687
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.
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.
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
题意:
给定的 n 个数中,从中去掉一个数字,使得剩余数字的 gcd 最大
思路:
前缀和后缀结合
preGcd[ i ] : 记录的是第 i 个位置之前所有数的 gcd
postGcd[ i ] : 记录的是第 i 个位置之后所有数的 gcd
均不包含本身
当去除某个数的时候,只需要求出 preGcd [i] 与 postGcd [i] 之间的 gcd
然后求出更大值即可
CODE:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <set>
#define MAX 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double PI = acos(-1);
const int M = 1e5+10;
const LL mod = 1e9+7;
int a[M];
int preGcd[M],postGcd[M];
int gcd(int a,int b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
int main()
{
int t,n;
memset(preGcd,0);
memset(postGcd,0);
cin >> t;
while(t--)
{
cin >> n;
int sum = 0;
for(int i=0; i<n; i++){
cin >> a[i];
}
preGcd[0] = a[0];
postGcd[n-1] = a[n-1];
for(int i=1; i<=n-1; i++)
preGcd[i] = gcd(a[i-1],preGcd[i-1]);
for(int i=n-2; i>=0; i--)
postGcd[i] = gcd(a[i+1],postGcd[i+1]);
int ans1 = postGcd[0];
int ans2 = preGcd[n-1];
int ans = max(ans1,ans2);
for(int i=1; i<n-1; i++){
int ans3 = gcd(preGcd[i],postGcd[i]);
ans = max(ans,ans3);
}
cout << ans << endl;
}
}
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <set>
#define MAX 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double PI = acos(-1);
const int M = 1e5+10;
const LL mod = 1e9+7;
int a[M];
int preGcd[M],postGcd[M];
int gcd(int a,int b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
int main()
{
int t,n;
memset(preGcd,0);
memset(postGcd,0);
cin >> t;
while(t--)
{
cin >> n;
int sum = 0;
for(int i=0; i<n; i++){
cin >> a[i];
}
preGcd[0] = a[0];
postGcd[n-1] = a[n-1];
for(int i=1; i<=n-1; i++)
preGcd[i] = gcd(a[i-1],preGcd[i-1]);
for(int i=n-2; i>=0; i--)
postGcd[i] = gcd(a[i+1],postGcd[i+1]);
int ans1 = postGcd[0];
int ans2 = preGcd[n-1];
int ans = max(ans1,ans2);
for(int i=1; i<n-1; i++){
int ans3 = gcd(preGcd[i],postGcd[i]);
ans = max(ans,ans3);
}
cout << ans << endl;
}
}