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的和 范围 ...
随机推荐
- Spring Boot (6) Spring Data JPA
JPA 全称Java Persistence API,JPA通过JDK 5.0注解或xml描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 JPA是sun官方提出的java持久化规范, ...
- input表单(02)
01.表单的代码实现 <!DOCTYPE html> <html> <head> <title>世纪佳缘,你在我也在</title> < ...
- 《java数据结构与算法》系列之“快速排序"
部门没人了,公司动作好快...算了,不想了!还是学知识吧,只有它不会让自己失望. 继续我的算法学习,快速排序是应用很广的算法,看了一早上才看懂些,感觉比冒泡之类的难理解,可能主要是递归那块自己不是很理 ...
- Assembly之instruction之Register Mode
Assembler Code Content of ROM MOV R10,R11 MOV R10,R11 Length: One or two words Operation: Move the c ...
- OpenCV的AdaptiveThreshold函数
摘自于OpenCV Doc2.410,opencv2refman文档. 1.函数原型 adaptiveThreshold //Applies an adaptive threshold to an a ...
- 国外AI界牛人主页 及资源链接
感觉 好博客要收集,还是贴在自己空间里难忘!!! 原文链接:http://blog.csdn.net/hitwengqi/article/details/7907366 http://people.c ...
- BZOJ 1705: [Usaco2007 Nov]Telephone Wire 架设电话线 DP + 优化 + 推导
Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设在已有的N(2 <= ...
- Day 18 hashlib,logging模块
hashlib 模块 作用:hash是一种算法,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法,该算法接受传入的内容,经过运算得到一串hash值 特点: 1.只要 ...
- 2019 gplt团体程序设计天梯赛总结
分很菜… 以后写题一定记得把题意理清楚了再开始写. 模拟题还是大坑,代码还是写得不够多,代码量一大就写bug. 补题 l1-8 估值一亿的AI核心代码 补题链接:https://pintia.cn/p ...
- 安装 Ubuntu 14.04 之后要做的一些事
转自: http://www.cnblogs.com/marcowei/p/3841342.html 安装 ubuntu14.04 之后要做的一些事 前言: 用 ubuntu14.04 也有一段时间 ...