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

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

  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. const int MAX_RANGE = 1010;
  6.  
  7. int GetGcd(int a, int b)
  8. {
  9. return b ? GetGcd(b, a % b) : a;
  10. }
  11.  
  12. struct GcdRangeTree
  13. {
  14. private:
  15. int Gcd[MAX_RANGE * 4];
  16. int N;
  17.  
  18. void PullUp(int cur)
  19. {
  20. Gcd[cur] = GetGcd(Gcd[cur * 2], Gcd[cur * 2 + 1]);
  21. }
  22.  
  23. void Init(int cur, int sl, int sr, int *a)
  24. {
  25. if (sl == sr)
  26. {
  27. Gcd[cur] = a[sr];
  28. return;
  29. }
  30. int mid = (sl + sr) / 2;
  31. Init(cur * 2, sl, mid, a);
  32. Init(cur * 2 + 1, mid + 1, sr, a);
  33. PullUp(cur);
  34. }
  35.  
  36. int Query(int cur, int sl, int sr, int al, int ar)
  37. {
  38. //printf("cur(%d,%d) find(%d,%d)\n", sl, sr, al, ar);
  39. if (al <= sl && sr <= ar)
  40. return Gcd[cur];
  41. int ans=0, mid = (sl + sr) / 2;
  42. if (al <= mid)
  43. ans = Query(cur * 2, sl, mid, al, ar);
  44. if (ar > mid)
  45. {
  46. if (ans)
  47. ans = GetGcd(ans, Query(cur * 2 + 1, mid + 1, sr, al, ar));
  48. else
  49. ans = Query(cur * 2 + 1, mid + 1, sr, al, ar);
  50. }
  51. return ans;
  52. }
  53.  
  54. public:
  55. GcdRangeTree(int n, int *a)
  56. {
  57. N = n;
  58. memset(Gcd, 0, sizeof(Gcd));
  59. Init(1, 1, N, a);
  60. }
  61.  
  62. int Query(int l, int r)
  63. {
  64. return Query(1, 1, N, l, r);
  65. }
  66. };
  67.  
  68. int main()
  69. {
  70. int range, opCnt;
  71. static int a[MAX_RANGE];
  72. scanf("%d%d", &range, &opCnt);
  73. for (int i = 1; i <= range; i++)
  74. scanf("%d", a + i);
  75. static GcdRangeTree g(range, a);
  76. while (opCnt--)
  77. {
  78. int l, r;
  79. scanf("%d%d", &l, &r);
  80. printf("%d\n", g.Query(l, r));
  81. }
  82. return 0;
  83. }

  

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. Ubuntu下搭建repo服务器(一): 配置gitosis

    1. 说明 服务器端IP: 192.168.1.126,下文简称:A端: 客户端IP: 192.168.130.19,下文简称:B端: Android工程代号:17435. 2. 安装必要软件(A端) ...

  2. 联想笋尖S90(S90-t 、S90-u)解锁BootLoader

    工具下载链接: http://pan.baidu.com/s/1eSgZuka 备用下载链接: http://pan.baidu.com/s/1dFKqSId 本篇教程,仅限于联想笋尖S90(S90- ...

  3. Leetcode0024--Swap Nodes in Pairs 链表配对交换

    [转载请注明]http://www.cnblogs.com/igoslly/p/8707274.html 来看一下题目: Given a linked list, swap every two adj ...

  4. list用法(用到了再补充)

    之前学list吧,也知道很多,但是到用的时候却无从下手,还是不熟悉的缘故,看来基础知识应该再加强,要达到信手拈来的程度才行. 先说下list的特性:有序可重复,也可以存储多个空值. 我用到的方法: L ...

  5. 171129-workaround on ubuntu-seting up piston for steem

    setup ubuntu environment variables sudo vi /etc/environment Then set all below variables: percentCha ...

  6. I2C controller core之Bit controller(02)

    4 generate clock and control signals 1 -- architecture signal iscl_oen, isda_oen : std_logic; -- int ...

  7. CNN结构:MXNet设计和实现简介

    对原文有大量修改,如有疑惑,请移步原文. 参考链接:MXNet设计和实现简介 文章翻译于:https://mxnet.incubator.apache.org/architecture/index.h ...

  8. MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码)

    MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...

  9. react性能调谐与diff算法

    一个页面其实就相当于是一颗dom树,里面有很多它的子节点,然后你每次去操作一个事件,它都会生成一个虚拟dom,它会跟上一个虚拟dom进行比对,这里运用的算法叫做diff算法,当它找到需要改变的组件的时 ...

  10. 构造函数+原型的js混合模式

    function Parent(){ this.name = "李小龙"; this.age = "30"; };Parent.prototype.lev=fu ...