HDU 6027 Easy Summation (gcd)

来源:互联网 发布:淘宝买游戏装备流程 编辑:程序博客网 时间:2024/06/02 01:51

思路:

消除冗余操作。
分别从左到右(lef数组)和从右到左(rig数组)进行gcd
然后对于i(从2到n-1),找出gcd(lef[i-1],rig[i+1])最大的值

#include <cstdio>#include <iostream>#include <string.h>#include <queue>#include <algorithm>typedef long long int lli;using namespace std;int a[100020];int lef[100020];int rig[100020];lli gcd(lli a,lli b){    return b==0? a:gcd(b,a%b);}int main(){    int t;    cin >> t;    int n;    int ans;    while(t--){        ans = 0;        scanf("%d",&n);        int temp;        for(int i = 1;i <= n;i++){            scanf("%d",a+i);        }        lef[1] = a[1];        for(int i = 2;i <= n;i++){            lef[i] = gcd(lef[i-1],a[i]);        }        rig[n] = a[n];        for(int i = n-1;i >= 1;i--){            rig[i] = gcd(rig[i+1],a[i]);        }        for(int i = 2;i <= n-1;i++){            temp = gcd(lef[i-1],rig[i+1]);            ans = max(temp,ans);        }        ans = max(ans,rig[2]);        ans = max(ans,lef[n-1]);        printf("%d\n",ans);    }}