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的和 范围 ...
随机推荐
- 5.7 Liquibase:与具体数据库独立的追踪、管理和应用数据库Scheme变化的工具。-mybatis-generator将数据库表反向生成对应的实体类及基于mybatis的mapper接口和xml映射文件(类似代码生成器)
一. liquibase 使用说明 功能概述:通过xml文件规范化维护数据库表结构及初始化数据. 1.配置不同环境下的数据库信息 (1)创建不同环境的数据库. (2)在resource/liquiba ...
- (转)Vue 爬坑之路(二)—— 组件之间的数据传递
Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. 首先用 vue-cli 创建一个项目,其中 App.vue 是父组件,com ...
- do…while语句
有些情况下,不论条件是否满足,循环过程必须至少执行一次,这时可以采用do...while语句.就像如图7.4所示登录账号一样,需要先输入密码和账户名,后进行判断:如果密码始终不正确,则循环要求用户输入 ...
- Windows下错误码全解析
windows系统下,调用函数出错时.可以调用GetLastError函数返回错误码.但是GetLastError函数返回值是DWORD类型,是一个整数.如果想要知道函数调用的真正错误原因,就需要对这 ...
- SQL server高级语法
1. 公共表达式CTE 公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE.递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达 ...
- Eclipse 插件ibeetl
启动Eclipse 打开菜单栏按一下菜单路径依次打开 Help -> Install New Softwave… ->点击Add按钮弹出一个对话框 弹出的对话框中Name随意填写,如填写“ ...
- How to add jdk8 in Eclipse Indigo
I just read How to have Eclipse use JDK8 to compile a project? What i added jdk8 to eclipse as, Fro ...
- CDR服装设计-旗袍款式图
在服装行业中的服装款式设计.图案设计和面料设计等方面,CorelDRAW是一款常用绘图设计软件,用CorelDRAW绘制款式图比手绘更容易表达服装结构.比例.图案.色彩等要素,服装款图主要目的是为了更 ...
- 怎样在PDF文件中查找某个特定的词?
不得不说中国的修饰词太多了例如:“滚”可以这样说,请你以一种圆润的方式离开:上次小编在路上听到某男子打电话,好像是给女孩子,那口才,是真的牛,夸人不带重复的.要不是我男孩子,我都想以身相许了.人们常常 ...
- Laravel Cache 缓存使用
导入:use Cache; Cache::put('key', 'value', $minutes); 添加一个缓存 Cache 门面的 get 方法用于从缓存中获取缓存项,如果缓存项不存在,返回 n ...