YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

单点时限: 2.0 sec

内存限制: 512 MB

一个数组a,现在你需要删除某一项使得它们的gcd最大,求出这个最大值。

输入格式

第一行输入一个正整数n,表示数组的大小,接下来一行n个数,第i个数为ai(2n105,1ai109)

输出格式

输出删除掉某个数以后的gcd的最大值。

样例

input
4
2 4 8 1
output
2
input
4
1 2 3 4
output
1

提示

样例一:删除第四个元素后,2,4,8的最大公因子为2。
样例二:无论删除哪一个,最大公因子都为1。

 
#include<iostream>
#include<algorithm>
#define N 100010
using namespace std;
typedef long long ll;

ll arr[N];
ll pre[N]={0},od[N]={0};//前缀与后缀 
int main(){
    
    int n;
    cin>>n;
    
    for(int i=1;i<=n;i++){
        cin>>arr[i];
    }
    
    pre[1]=arr[1]; 
    od[n]=arr[n];
    
    for(int i=2;i<=n;i++){
        pre[i]=__gcd(pre[i-1],arr[i]);//前缀gcd
    }
    
    for(int i=n-1;i>0;i--){
        od[i]=__gcd(od[i+1],arr[i]);//后缀gcd
    }
    
    ll max1=0;
    ll p;
    for(int i=1;i<=n;i++){
        if(i==1){
            p=od[i+1];
        }
        else {
            p=__gcd(pre[i-1],od[i+1]);//pre[i-1]指的是前i-1个个数的gcd,od[i+1]指的是从i+1到第N个数的gcd
            if(p>max1){
            max1=p; 
            }
        }
    }
    cout<<max1<<endl;
    return 0;
} 

 

 

 

 

posted on 2019-08-01 21:29  Target--fly  阅读(209)  评论(0编辑  收藏  举报