题目大意:给定一行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. RabbitMQ .NET消息队列使用入门(二)【多个队列间消息传输】

    孤独将会是人生中遇见的最大困难. 实体类: DocumentType.cs public enum DocumentType { //日志 Journal = 1, //论文 Thesis = 2, ...

  2. 5.13Mysql数据库Database

    数据库的基本概念 1.什么是数据库: 用于存储和管理数据的仓库. 2.数据库的特点: 1.持久化存储数据的.其实数据库就是一个文件系统. 2.方便存储和管理数据 3.使用了统一的方式操作数据库---s ...

  3. os的进程调度算法(抄袭的)

    package me.letterwish.test; import java.io.BufferedInputStream; import java.io.FileInputStream; impo ...

  4. C#多线程方法 可传参

    //将线程执行的方法和参数都封装到一个类里面.通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递参数.using System; using System.Threading; //Thre ...

  5. 利用node、express初始化项目

    前端做整站是开发,例如:前端是用了vue创建初始化项目,后端我们不会php.java等,我们只能用node去创建去做后端代码,本文就给大家讲解最基础的从零开始创建一个项目的后端环境. 一般来说前后端代 ...

  6. marquee标签弹幕效果

    播放个视频的时候看到很有趣的弹幕,想着前端能不能做个弹幕效果.弹幕是滚动的,所以首先想到了<marquee>标签.但事实上,<marquee>标签不是w3c的标准,只是主流的浏 ...

  7. Tomcat内存分析相关方法(jmap和mat)

    Linux环境命令行 首先,根据进程命令,获取运行的tomcat的进程ID ps aux | grep tomcat | grep java | grep bsc 在第二列可以看到进程ID 然后使用j ...

  8. window path 的基本配置

    %JAVA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\ ...

  9. Xshell连接linux服务器不成功的乌龙问题

    一般xshell连接linux服务器不成功有以下几个问题: linux防火墙拦截,导致Xshell不能访问linux 操作方法: firewalld(CentOS7):启动 :systemctl st ...

  10. 基于MATLAB的语音信号处理

    一.图形界面设计 1.新建GUI界面 2.新建空白页 3.命名为"yydsp",打开界面 4.拖放控件 5.按预定功能修改界面 6.填写Callback函数 未填写前的代码: fu ...