码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷——P1890 gcd区间

时间:2017-11-26 15:51:32      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:描述   ret   return   gcd   整数   bsp   数字   span   sample   

P1890 gcd区间

题目描述

给定一行n个正整数a[1]..a[n]。

m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数。

输入输出格式

输入格式:

 

第一行两个整数n,m。

第二行n个整数表示a[1]..a[n]。

以下m行,每行2个整数表示询问区间的左右端点。

保证输入数据合法。

 

输出格式:

 

共m行,每行表示一个询问的答案。

 

输入输出样例

输入样例#1: 复制
5 3
4 12 3 6 7
1 3
2 3
5 5
输出样例#1: 复制
1
3
7

说明

对于30%的数据,n <= 100, m <= 10

对于60%的数据,m <= 1000

对于100%的数据,1 <= n <= 1000,1 <= m <= 1,000,000

                0 < 数字大小 <= 1,000,000,000




n^2*log n枚举,o(1)查询 枚举左右端点然后求出区间的gcd
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 1010
using namespace std;
int n,m,x,y,a[N],gcd[N][N];
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
    return x*f;
}
int GCD(int a,int b)
{
    if(b==0) return a;
    return  GCD(b,a%b);
}
int main()
{
    n=read();m=read();
    for(int i=1;i<=n;i++)
     a[i]=read();
    for(int i=1;i<=n;i++)
     for(int j=i;j<=n;j++)
      {
           if(j==i) gcd[i][j]=a[j];
           else
           {
                x=min(gcd[i][j-1],a[j]);
                y=max(gcd[i][j-1],a[j]);
                gcd[i][j]=GCD(x,y);
           } 
      }
    while(m--)
    {
        x=read(),y=read();
        printf("%d\n",gcd[x][y]);
    }
    return  0;
}

 



洛谷——P1890 gcd区间

标签:描述   ret   return   gcd   整数   bsp   数字   span   sample   

原文地址:http://www.cnblogs.com/z360/p/7898984.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!