hdu6025 简单枚举即可

来源:互联网 发布:遥远的救世主 知乎 编辑:程序博客网 时间:2024/06/05 18:43

题目链接
HDU6025
题目大意
就是在一个数列,取出某一个数,让他们的最大公约数最大,输出这个最大公约数。

思路
可以定义from,to两个数组,from数组用来保存从这个数列的第一项到第一项,第一项到第二项,直到第n项的最大公约数。to数组,同理可得,用来保存最后一项直到第一项的最大公约数。再定义一个ans数组,ans【i】就储存数列的第i+1项去除以后的最大公约数。

  • ans[i]=gcdfrom[i1]to[i+1]
    然后输出ans数组里最大的公约数就行了

代码

#include"iostream"#include"cstdio"#include"cmath"using namespace std;const int maxn=100000+5;int gcd(int x,int y){    if(y==0) return x;    else return(gcd(y,x%y));}int main(){    int T,n,a[maxn],from[maxn],to[maxn],ans[maxn],k;    scanf("%d",&T);    while(T--)    {        k=0;        scanf("%d",&n);        for(int i=0; i<n; i++)            scanf("%d",&a[i]);        from[0]=a[0];        to[n-1]=a[n-1];        for(int i=1; i<n; i++)        {            from[i]=gcd(from[i-1],a[i]);        }        for(int j=n-2; j>=0; j--)        {            to[j]=gcd(to[j+1],a[j]);        }        ans[0]=to[1];        ans[n-1]=from[n-2];        for(int i=1; i<=n-2; i++)            ans[i]=gcd(from[i-1],to[i+1]);        for(int i=0; i<=n-1; i++)            k=max(k,ans[i]);        printf("%d\n",k);    }    return 0;}
原创粉丝点击