luogu1890 gcd区间
题目大意:给定一行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区间的更多相关文章
- 洛谷 P1890 gcd区间
P1890 gcd区间 题目提供者 洛谷OnlineJudge 标签 数论(数学相关) 难度 普及/提高- 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R] ...
- HDU 5726 GCD 区间GCD=k的个数
GCD Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- 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]);这样查询 ...
- 洛谷——P1890 gcd区间
P1890 gcd区间 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n ...
- 洛谷P1890 gcd区间 [2017年6月计划 数论09]
P1890 gcd区间 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n ...
- 洛谷1890 gcd区间
题目描述 给定一行n个正整数a[1]..a[n].m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m.第二行n个整数表示a ...
- 洛谷P1890 gcd区间
题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m. 第二行n个整数表 ...
- luoguP1890 gcd区间 [st表][gcd]
题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m. 第二行n个整数表 ...
- 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的和 范围 ...
随机推荐
- Ubuntu下搭建repo服务器(一): 配置gitosis
1. 说明 服务器端IP: 192.168.1.126,下文简称:A端: 客户端IP: 192.168.130.19,下文简称:B端: Android工程代号:17435. 2. 安装必要软件(A端) ...
- 联想笋尖S90(S90-t 、S90-u)解锁BootLoader
工具下载链接: http://pan.baidu.com/s/1eSgZuka 备用下载链接: http://pan.baidu.com/s/1dFKqSId 本篇教程,仅限于联想笋尖S90(S90- ...
- Leetcode0024--Swap Nodes in Pairs 链表配对交换
[转载请注明]http://www.cnblogs.com/igoslly/p/8707274.html 来看一下题目: Given a linked list, swap every two adj ...
- list用法(用到了再补充)
之前学list吧,也知道很多,但是到用的时候却无从下手,还是不熟悉的缘故,看来基础知识应该再加强,要达到信手拈来的程度才行. 先说下list的特性:有序可重复,也可以存储多个空值. 我用到的方法: L ...
- 171129-workaround on ubuntu-seting up piston for steem
setup ubuntu environment variables sudo vi /etc/environment Then set all below variables: percentCha ...
- I2C controller core之Bit controller(02)
4 generate clock and control signals 1 -- architecture signal iscl_oen, isda_oen : std_logic; -- int ...
- CNN结构:MXNet设计和实现简介
对原文有大量修改,如有疑惑,请移步原文. 参考链接:MXNet设计和实现简介 文章翻译于:https://mxnet.incubator.apache.org/architecture/index.h ...
- MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码)
MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...
- react性能调谐与diff算法
一个页面其实就相当于是一颗dom树,里面有很多它的子节点,然后你每次去操作一个事件,它都会生成一个虚拟dom,它会跟上一个虚拟dom进行比对,这里运用的算法叫做diff算法,当它找到需要改变的组件的时 ...
- 构造函数+原型的js混合模式
function Parent(){ this.name = "李小龙"; this.age = "30"; };Parent.prototype.lev=fu ...