热身训练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( ...
随机推荐
- C# List集合类常用操作:四、删除
Clear() 从 List<T> 中移除所有元素. List<Employees> employees = new List<Employees>(); empl ...
- Docker部署启动错误,需要手动进入Docker的容器里,启动程序,排查错误
#docker-compose build --no-cache //重新创建容器,不管有没有 #docker-compose up #docker-compose up -d //后台启动并运行容器 ...
- 【PHP数据结构】线性表?顺序表?链表?别再傻傻分不清楚
遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门.今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总. 上文说过,物理结构是用于确定数据以何种方式存储的.其他的数据结构(树.图). ...
- Park-2018论文
太阳射电图:Solar magnetograms, EUV images, GOES X-ray flux data. Magnetograms: http://solar-center.sta ...
- javascript 责任链模式 Chain of Responsibility
* 可拆分的责任链节点 // 可拆分的责任链节点 // Chain.prototype.setNextSuccessor 指定在链条中的下一个节点 // Chain.prototype.passReq ...
- 安卓模拟器genymotion安装
上一篇已经讲了appium的搭建.那么搭建好后,我们需要测试不同机型,这个时候除了真机外,可以选择安装模拟器.市面上的模拟器有很多:夜神.逍遥.mumu.android emulator.genymo ...
- 51nod1355-斐波那契的最小公倍数【min-max容斥】
正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1355 题目大意 定义\(f_i\)表示斐波那契的第\(i\)项,给出一个 ...
- 学会了这些英文单词,妈妈再也不用担心我学不会Python
前言 很多转行或刚入行做测试的小伙伴学习Python时,经常会问一句话:我英语不好能不能学会代码. 答案是:肯定的!你如果英语好学开发语言肯定要比不会英语的小伙伴学起来.当代码报错时全是英文,毕竟 ...
- strategy策略模式个人理解
首先了解策略模式的主要作用:能够把算法进行封装和动态传递: 可能听上去很抽象,我们引入一个方便理解的案例来解释: 给定一个数组 int[] array = {32,12,42,26,-23,0,-2, ...
- Kubernetes client-go Indexer / ThreadSafeStore 源码分析
Kubernetes client-go Indexer / ThreadSafeStore 源码分析 请阅读原文:原文地址 Contents 概述 Indexer 接口 ThreadSafe ...