题目大意:给定一行n个正整数a[1]..a[n]。m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数。

因为gcd满足交换律和结合律,所以用线段树维护区间上的gcd值即可。

#include <cstdio>
#include <cstring>
using namespace std; const int MAX_RANGE = 1010; int GetGcd(int a, int b)
{
return b ? GetGcd(b, a % b) : a;
} struct GcdRangeTree
{
private:
int Gcd[MAX_RANGE * 4];
int N; void PullUp(int cur)
{
Gcd[cur] = GetGcd(Gcd[cur * 2], Gcd[cur * 2 + 1]);
} void Init(int cur, int sl, int sr, int *a)
{
if (sl == sr)
{
Gcd[cur] = a[sr];
return;
}
int mid = (sl + sr) / 2;
Init(cur * 2, sl, mid, a);
Init(cur * 2 + 1, mid + 1, sr, a);
PullUp(cur);
} int Query(int cur, int sl, int sr, int al, int ar)
{
//printf("cur(%d,%d) find(%d,%d)\n", sl, sr, al, ar);
if (al <= sl && sr <= ar)
return Gcd[cur];
int ans=0, mid = (sl + sr) / 2;
if (al <= mid)
ans = Query(cur * 2, sl, mid, al, ar);
if (ar > mid)
{
if (ans)
ans = GetGcd(ans, Query(cur * 2 + 1, mid + 1, sr, al, ar));
else
ans = Query(cur * 2 + 1, mid + 1, sr, al, ar);
}
return ans;
} public:
GcdRangeTree(int n, int *a)
{
N = n;
memset(Gcd, 0, sizeof(Gcd));
Init(1, 1, N, a);
} int Query(int l, int r)
{
return Query(1, 1, N, l, r);
}
}; int main()
{
int range, opCnt;
static int a[MAX_RANGE];
scanf("%d%d", &range, &opCnt);
for (int i = 1; i <= range; i++)
scanf("%d", a + i);
static GcdRangeTree g(range, a);
while (opCnt--)
{
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", g.Query(l, r));
}
return 0;
}

  

luogu1890 gcd区间的更多相关文章

  1. 洛谷 P1890 gcd区间

    P1890 gcd区间 题目提供者 洛谷OnlineJudge 标签 数论(数学相关) 难度 普及/提高- 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R] ...

  2. HDU 5726 GCD 区间GCD=k的个数

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  3. P1890 gcd区间

    P1890 gcd区间我一开始80分暴力,模拟100做法dpO(n^2+m)f[i][j]表示i到j的 gcd初始化f[i][i]=i;f[i][j]=gcd(f[i][j-1],a[j]);这样查询 ...

  4. 洛谷——P1890 gcd区间

    P1890 gcd区间 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n ...

  5. 洛谷P1890 gcd区间 [2017年6月计划 数论09]

    P1890 gcd区间 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n ...

  6. 洛谷1890 gcd区间

    题目描述 给定一行n个正整数a[1]..a[n].m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m.第二行n个整数表示a ...

  7. 洛谷P1890 gcd区间

    题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m. 第二行n个整数表 ...

  8. luoguP1890 gcd区间 [st表][gcd]

    题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m. 第二行n个整数表 ...

  9. UESTC - 1724 GCD区间求和

    依然是神奇的欧拉函数 若GCD(n,i)=k 则GCD(n/k,i/k)=1, 令i/k=x,有GCD(n/k,x)=1, →k*GCD(n/k,x)=1中x的个数 = GCD(n,i)=k的和 范围 ...

随机推荐

  1. html5与css3入门知识点精炼

    <meta name = "keywords" content="…………"/>(网页搜索时要输入的关键字) <meta name = &qu ...

  2. 一张图说明DIV盒子距离

    虚线的宽高为你实际指定的width和height 虚线外的白色区域为padding 红色区域为border的width 红色外的区域为margin

  3. 搭建Hive所遇到的坑

    ##一.基本功能: 1.启动hive时报错 java.lang.ExceptionInInitializerError at java.lang.Class.forName0(Native Metho ...

  4. ★Java语法(四)——————————运算符

    使用除法“/”  ,要特别注意数据类型的问题.若被除数和除数都是整形,且被除数不能被除数整除时,这时输出的结果为整数,(即整形数/整形数=整形数),这是因为整形变量无法保存小数点后面的数据所致,要特别 ...

  5. ASP.NET刷新页面的六种方法

    第一: private void Button1_Click( object sender, System.EventArgs e )   {      Response.Redirect( Requ ...

  6. React Native - 使用Geolocation进行定位(获取当前位置、监听位置变化)

    1,getCurrentPosition()方法介绍 static getCurrentPosition(geo_success, geo_error?, geo_options? 该方法用于获取当前 ...

  7. turn.js中文API 写一个翻页效果的参数详细解释

    $('.flipbook').turn({     width: 922,     height: 600,     elevation: 50,     gradients: true,     a ...

  8. MATLAB图形界面设计(上)

    参考https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4307777.html 一.图形句柄 1.定义 MATLAB在创建每一个图形对象时,都会给该对 ...

  9. Clocksource tsc unstable

    内核在启动过程中会根据既定的优先级选择时钟源.优先级的排序根据时钟的精度与访问速度. 其中CPU中的TSC寄存器是精度最高(与CPU最高主频等同),访问速度最快(只需一条指令,一个时钟周期)的时钟源, ...

  10. 企业版 Linux 附加软件包(EPEL)

    企业版 Linux 附加软件包(以下简称 EPEL)是一个由特别兴趣小组创建.维护并管理的,针对 红帽企业版 Linux(RHEL)及其衍生发行版(比如 CentOS.Scientific Linux ...