热身训练2 GCD
简要题意:
n个数字,a1,a2,...,an
m次询问(l,r),每次询问需回答 1.gcd(al,al+1,al+2,...,ar);2.gcd(ax,ax+1,ax+2,...,ay)=gcd(al,al+1,al+2,...,ar)的个数(x<=y)。
分析:
算第一个询问,由于a数组是静态的,我们可以用ST表来预处理。
对于第二个询问,我们先令左端点x固定,那么随着y的增加,gcd(ax,...,ay)会越来越小,这是可以二分的!!!
这样看来,我们完全可以预处理出每个gcd所有的个数!!!
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define LL long long
const int N=1e5+5;
int gcd(const int a, const int b)
{
if(b == 0) return a;
return gcd(b, a%b);
}
int f[N][30], lg[N], n;
inline void ST_init()
{
for(re i=1;i<=20;++i)
for(re j=1;j+(1<<i)-1 <= n; ++j)
f[j][i] = gcd(f[j][i-1], f[j+(1<<(i-1))][i-1]);
}
inline int gtgcd(const int x, const int y)
{
int k=lg[y-x+1];
return gcd(f[x][k], f[y-(1<<k)+1][k]);
}
inline void work()
{
scanf("%d",&n);
for(re i=1;i<=n;++i) scanf("%d",&f[i][0]);
ST_init();
map<int, long long>mp;
for(re i=1;i<=n;++i)
{
int p=i, tmp = f[i][0];
while(p <= n)
{
int ret=-1, L=p, R=n;
while(L <= R)
{
int mid=(L+R)>>1;
if(gtgcd(i, mid) == tmp) ret=mid, L=mid+1;
else R=mid-1;
}
mp[tmp] += ret-p+1;
p = ret+1;
tmp = gtgcd(i, p);
}
} int m; scanf("%d",&m);
while(m--)
{
int x, y, g;
scanf("%d%d",&x,&y);
g = gtgcd(x, y);
printf("%d %lld\n", g, mp[g]);
}
}
signed main()
{
for(re i=2;i<=100000;++i) lg[i] = lg[i>>1]+1;
int T; scanf("%d",&T);
for(re i=1;i<=T;++i)
{
printf("Case #%d:\n", i);
work();
}
return 0;
}
热身训练2 GCD的更多相关文章
- 数位dp & 热身训练7
数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...
- 热身训练4 Article
Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ...
- 热身训练4 Eighty seven
Eighty seven 简要题意: n个卡片,其中第i个卡片的数值为$a[i]$.一共q次询问,每次询问将删去其中3个卡片(可能删除若干相同的卡片)后,问能否选出10个卡片,数值之和等于87. n≤ ...
- 热身训练2 The All-purpose Zero
The All-purpose Zero 简要题意: 长度为n的数组,每个数字为S[i],$0$是一种很神奇的数字,你想要的,它都可以变! 问这个序列的最长上升子序列长度为多少? 分析: 我们将除了 ...
- 热身训练3 Palindrome
Palindrome 简要题意: 我们有一个字符串S,字符串的长度不超过500000. 求满足S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)(n≥2)的子串个数. 分析: 我们能通过简 ...
- 热身训练2 Another Meaning
题目来源 简要题意: 众所周知,在许多情况下,一个词语有两种意思.比如"hehe",不仅意味着"hehe",还意味着"excuse me". ...
- 热身训练1 Calculator
题目出处:Calculator 简要题意: 你有一个确定的函数,f(x)=+...*...^...,其中共有n个操作,从左到右依次计算. 共有m次询问,我们每次询问,1.会修改f(x)中的操作:2.输 ...
- 热身训练1 ping ping ping
点此进入 题意: 一棵树,n+1 个节点,以0号节点为根,给出端点(a,b),节点a到节点b的路径上,至少有一个点是"坏掉的",求"坏掉的点"最少 分析: St ...
- 热身训练1 Problem B. Harvest of Apples
http://acm.hdu.edu.cn/showproblem.php?pid=6333 题意: 求 C(0,n)+C(1,n)+...+C(m,n) 分析: 这道题,我们令s(m,n) = C( ...
随机推荐
- 通过HttpURLConnection下载图片到本地--批量下载
一.背景说明 这篇文章讲述的是批量下载附件,在上一篇文章中,介绍了下载单个附件(上一篇文章). 二.实现思路 主要的实现思路:创建文件夹->文件夹中创建需要下载的文件->压缩文件夹-> ...
- 路由懒加载---Vue Router
一.什么是懒加载? 懒加载也就是延迟加载或者按需加载,即在需要的时候进行加载. 二.为什么在Vue路由中使用懒加载? 像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常 ...
- String底层使用是char数组还是byte数组
结论:jdk1.8及以前String底层使用是char[],1.9开始使用byte[] jdk1.8 jdk13
- CSP-J 2021 游记
今年是本人第一次参加CSP组的竞赛. Day 0 晚上复习了几套初赛试卷,做到晚上十点多结束.其实暑假已经做过不少了. Day 1 早上继续复习noip历年真题,在洛谷有题上面自己做题,一向只能考十几 ...
- 【OI】计算分子量 Molar mass UVa 1586 题解
题目:(由于UVa注册不了,还是用vjudge) https://vjudge.net/problem/UVA-1586 详细说明放在了注释里面.原创. 破题点在于对于一个元素的组合(元素+个数),只 ...
- javascript,jquery在父窗口触发子窗口(iframe)某按钮的click事件
$('iframe').contents().find(".btn").click(); 其中 contents(): 查找匹配元素内部所有的子节点(包括文本节点).如果元素是一个 ...
- Jmeter系列(11)- 自动化压力测试逻辑思路及例子
为什么需要进行自动化压力测试 手动逐步加压,需要人工改变并发数,还要等待.所有,我们完全可以制定好策略,让程序自动加压,自动等待,输出报告 实现思路 Jmeter脚本(.jmx文件)- 压测逻辑 Sh ...
- mybatis if else if 条件判断SQL片段表达式取值和拼接
前言 最近在开发项目的时候涉及到复杂的动态条件查询,但是mybaits本身不支持if elseif类似的判断但是我们可以间接通过 chose when otherwise 去实现其中choose为一个 ...
- javascript 自定义事件 发布-订阅 模式 Event
* javascript自定义事件 var myEvent = document.createEvent("Event"); myEvent.initEvent("myE ...
- hadoop生态之CDH搭建系列
本次搭建使用的版本是CloudManager 1.15.1