HDU 5726 GCD(ST&RMQ)
题目链接 GCD
先ST倍增预处理,f[i][j]表示从i开始(包含第i个数)的连续2^j个数的最大公约数。
这样就可以在O(1)内询问得到a[l]到a[r]之间的所有数的最大公约数的值。
然后对于每个数a[i],以这个数为开头的所有子序列的最大公约数的不同值不会超过30个。
而且不同的值是满足单调递减的。
那么就可以二分查找然后把对应值的个数塞进map。
时间复杂度O(Nlog(N))
#include <bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i(a); i <= (b); ++i)
#define LL long long const int N = 100000 + 10;
const int A = 30 + 1; map <int, LL> mp;
int a[N];
int T;
int n, m;
int l, r;
int f[N][A];
int gcd(int a, int b){return b? gcd(b, a % b) : a;} inline int Solve(int l, int r){
int k = (int)log2((double)(r - l + 1));
return gcd(f[l][k], f[r - (1 << k) + 1][k]);
} void Work(){
rep(i, 1, n) f[i][0] = a[i];
rep(j, 1, 17) rep(i, 1, n) if ((i + (1 << j) - 1) <= n) f[i][j] =gcd(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
} void setTable(){
mp.clear();
rep(i, 1, n){
int g = f[i][0], j = i;
while (j <= n){
int l = j, r = n;
while (l < r){
int mid = (l + r + 1) >> 1;
if (Solve(l, mid) == g) l = mid; else r = mid - 1;
}
mp[g] += l - j + 1;
j = l + 1;
g = Solve(i, j);
}
}
}
int main(){ scanf("%d", &T);
rep(Case, 1, T){
printf("Case #%d:\n", Case);
scanf("%d", &n);
rep(i, 1, n) scanf("%d", a + i);
Work();
setTable();
scanf("%d", &m);
while (m--){
scanf("%d%d", &l, &r);
int g = Solve(l, r);
printf("%d %lld\n", g, mp[g]);
}
} return 0; }
HDU 5726 GCD(ST&RMQ)的更多相关文章
- hdu 1695 GCD(莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 5726 GCD(RMQ+二分)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5726 题意:给出一串数字,现在有多次询问,每次询问输出(l,r)范围内所有数的gcd值,并且输出有多 ...
- HDU 5726 GCD (2016 Multi-University Training Contest 1)
Time Limit: 5000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Description Give y ...
- HDU 5726 GCD(DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5726 [题目大意] 给出数列An,对于询问的区间[L,R],求出区间内数的GCD值,并且求出GCD ...
- hdu 5726 GCD 暴力倍增rmq
GCD/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence ...
- HDU 1695 GCD (莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 1695 GCD(容斥)
题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { , ...
- hdu 1695 GCD (欧拉函数、容斥原理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- HDU 5726 GCD 区间GCD=k的个数
GCD Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
随机推荐
- leetcode-4-basic
解题思路:这道题比较简单,代码不贴了.需要注意的是: 数字与字符串之间的转换, char str[100]; sprintf(str, "%d", num); 解题思路: 这道题是 ...
- ubuntu更新内核后卡在自检无法开机的解决方法
下载deb包安装,重启后卡在自检,黑屏. 重启进旧内核,仍然卡在自检,黑屏. 强制关机后再重启,在grub按e修改启动项,改成直接进命令行模式.使用 sudo apt-get remove linux ...
- SPOJ QTREE4 - Query on a tree IV 树分治
题意: 给出一棵边带权的树,初始树上所有节点都是白色. 有两种操作: C x,改变节点x的颜色,即白变黑,黑变白 A,询问树中最远的两个白色节点的距离,这两个白色节点可以重合(此时距离为0). 分析: ...
- Django基于Pycharm开发之二 [使用django adminSite]
在使用django自带的adminsite的时候,有以下内容需要做. 1.数据迁移,管理表的创建. 2.启用本地化 (setting.py的配置) 一.数据迁移,默认情况下,安装django之后,dj ...
- luogu2762 太空飞行计划问题
最大权闭合子图 参考这,胡伯涛论文. 10,8,6,3这个简单割对应的闭合子图是A1,B1,B2 输出路径时,最后一次层次图中,与源点相连的点即选做的实验,与汇点相连的点即选用的仪器. #includ ...
- sql获取指定表所有列名及注释
SELECT b.name as 字段名 ,Type_name(b.xusertype) as 字段类型, Isnull(c.VALUE,'') as 字段说明FROM sysobjects a jo ...
- Selenium WebDriver- 操作 IFrame 中的页面元素
#encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webdriver i ...
- 大数据学习——scala数组
package com import scala.collection.mutable.ArrayBuffer /** * Created by Administrator on 2019/4/8. ...
- ES6 异步编程之一:Generator
Generator 生成器是es6原生提供的异步编程方案,其语法行为和传统函数完全不同,阮大的<ECMAScript 6 入门>一书中对生成器有比较详尽的介绍,还有一些其他的文章可以参考, ...
- isinstance 和 type 的区别
class A: pass class B(A): pass isinstance(A(), A) # returns True type(A()) == A # returns True isins ...