首页 > 代码库 > hdu 6025 前缀 后缀 gcd

hdu 6025 前缀 后缀 gcd

大致题意:

       去掉一个元素能使这个数列的GCD最大为多少

 

分析:

       我们求一个数列的GCD,是先求前两个元素的GCD,然后将这个GCD值在与下一个元素进行GCD运算。由此可知进行GCD运算的顺序对最终的结果是没有影响的。我们再看看数列的长度范围,小于100000。那我们就枚举去掉的那个元素,那么去掉元素后的数列的GCD即这个元素前面一段数列的GCD再与这个元素后面一段数列的GCD进行GCD运算。所以我们需要两个数组分别记录前缀GCD和后缀GCD,这两个数组都可以通过O(n)算法算出来。

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int a[100000+5];int pre[100000+5],suf[100000+5];int gcd(int a, int b){    while(b)    {        int c = a%b;        a = b;        b = c;    }    return a;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        int n;        scanf("%d",&n);        for(int i=0; i<n; i++)            scanf("%d",&a[i]);        pre[0]=a[0];        for(int i=1; i<n; i++)        {            pre[i]=gcd(pre[i-1],a[i]);        }        suf[n-1]=a[n-1];        for(int i=n-2; i>=0; i--)        {            suf[i]=gcd(suf[i+1],a[i]);        }        int ans=max(suf[1],pre[n-2]);        for(int i=1;i<n-1;i++)        {            ans=max(ans,gcd(pre[i-1],suf[i+1]));        }        printf("%d\n",ans);    }    return 0;}

 

hdu 6025 前缀 后缀 gcd