Problem Description

This is a simple problem. The teacher gives Bob a list of problems about GCD (Greatest Common Divisor). After studying some of them, Bob thinks that GCD is so interesting. One day, he comes up with a new problem about GCD. Easy as it looks, Bob cannot figure it out himself. Now he turns to you for help, and here is the problem:

Given an array \(a\) of \(N\) positive integers \(a_1, a_2, \cdots a_{N-1}, a_N\) ; a subarray of \(a\) is defined as a continuous interval between \(a_1\) and \(a_N\) .In other words,\(a_i, a_{i+1}, \cdots, a_{j-1}, a_j\) is a subarray of \(a\), for \(1\le i\le j\le N\).For a query in the form \((L, R)\) , tell the number of different GCDs contributed by all subarrays of the interval \([L, R]\).

Input

There are several tests, process till the end of input.

For each test, the first line consists of two integers \(N\) and \(Q\), denoting the length of the array and the number of queries, respectively. \(N\) positive integers are listed in the second line, followed by \(Q\) lines each containing two integers \(L,R\) for a query.

You can assume that

\(1≤N,Q≤100000\)

\(1≤a_i≤1000000\)

Output

For each query, output the answer in one line.

Sample Input

5 3

1 3 4 6 9

3 5

2 5

1 5

Sample Output

6

6

6

Description(CHN)

给定一个数列,多次询问,每次询问 \(L,R\),求 \([L,R]\) 中所有子区间的 \(gcd\) 有多少种

Solution

预处理对于数列中的每个位置,对于它为 \(R\) 的所有区间中不同的 \(gcd\) 出现的最右边的 \(L\) 是什么。这个东西直接在上一个位置的基础上枚举就好了

将询问离线

我们用BIT维护每种 \(gcd\) 出现的区间的 \(L\) 的最右的位置在哪里,然后就用差分计算答案就好了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=300000+10;
int n,m,a[MAXN],ans[MAXN];
std::map<int,int> M;
std::vector< std::pair<int,int> > V[MAXN],query[MAXN];
struct BIT{
int C[MAXN];
inline void init()
{
memset(C,0,sizeof(C));
}
inline int lowbit(int x)
{
return x&(-x);
}
inline void add(int x,int k)
{
while(x<=n)C[x]+=k,x+=lowbit(x);
}
inline int sum(int x)
{
if(!x)return 0ll;
int res=0;
while(x>0)res+=C[x],x-=lowbit(x);
return res;
}
};
BIT T;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
#define ft first
#define sd second
int main()
{
while(scanf("%d%d\n",&n,&m)!=EOF)
{
for(register int i=1;i<=n;++i)read(a[i]),V[i].clear(),query[i].clear();
T.init();M.clear();
V[1].push_back(std::make_pair(1,a[1]));
for(register int i=2;i<=n;++i)
{
int now=a[i];V[i].push_back(std::make_pair(i,a[i]));
for(register int j=0,lt=V[i-1].size();j<lt;++j)
{
std::pair<int,int> pr=V[i-1][j];
int d=std::__gcd(now,pr.sd);
if(d!=now)V[i].push_back(std::make_pair(pr.ft,d)),now=d;
}
}
for(register int i=1;i<=m;++i)
{
int l,r;read(l);read(r);
query[r].push_back(std::make_pair(i,l));
}
for(register int i=1;i<=n;++i)
{
for(register int j=0,lt=V[i].size();j<lt;++j)
{
std::pair<int,int> pr=V[i][j];
if(M[pr.sd])T.add(M[pr.sd],-1);
T.add(pr.ft,1);M[pr.sd]=pr.ft;
}
for(register int j=0,lt=query[i].size();j<lt;++j)
{
std::pair<int,int> pr=query[i][j];
ans[pr.ft]=T.sum(i)-T.sum(pr.sd-1);
}
}
for(register int i=1;i<=m;++i)printf("%d\n",ans[i]);
}
return 0;
}

【刷题】HDU 5869 Different GCD Subarray Query的更多相关文章

  1. HDU 5869 Different GCD Subarray Query rmq+离线+数状数组

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5869 Different GCD Subarray Query Time Limit: 6000/3 ...

  2. HDU 5869 Different GCD Subarray Query 离线+树状数组

    Different GCD Subarray Query Problem Description   This is a simple problem. The teacher gives Bob a ...

  3. hdu 5869 Different GCD Subarray Query BIT+GCD 2016ICPC 大连网络赛

    Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  4. HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...

  5. HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景

    http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...

  6. HDU 5869 Different GCD Subarray Query

    离线操作,树状数组,$RMQ$. 这个题的本质和$HDU$ $3333$是一样的,$HDU$ $3333$要求计算区间内不同的数字有几个. 这题稍微变了一下,相当于原来扫描到$i$的之后是更新$a[i ...

  7. HDU 5869 Different GCD Subarray Query 树状数组+离线

    Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...

  8. HDU 5869 Different GCD Subarray Query(2016大连网络赛 B 树状数组+技巧)

    还是想不到,真的觉得难,思路太巧妙 题意:给你一串数和一些区间,对于每个区间求出区间内每段连续值的不同gcd个数(该区间任一点可做起点,此点及之后的点都可做终点) 首先我们可以知道每次添加一个值时gc ...

  9. HDU 5869.Different GCD Subarray Query-区间gcd+树状数组 (神奇的标记右移操作) (2016年ICPC大连网络赛)

    树状数组... Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/6 ...

随机推荐

  1. #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

    ((GPIO_TypeDef *) GPIOA_BASE)表示将GPIOA_BASE强制转换为指针类型的结构体, #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) ...

  2. go语言之行--结构体(struct)详解、链表

    一.struct简介 go语言中没有像类的概念,但是可以通过结构体struct实现oop(面向对象编程).struct的成员(也叫属性或字段)可以是任何类型,如普通类型.复合类型.函数.map.int ...

  3. 2017-2018-2 『网络对抗技术』Exp3:免杀原理与实践

    1. 免杀原理与实践说明 一.实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧:(1.5分) ...

  4. SVD(奇异值分解)小结

    注:奇异值分解在数据降维中有较多的应用,这里把它的原理简单总结一下,并且举一个图片压缩的例子,最后做一个简单的分析,希望能够给大家带来帮助. 1.特征值分解(EVD) 实对称矩阵 在理角奇异值分解之前 ...

  5. [图片生成]使用VAEs生成新图片

    变分自动编码器生成图片 从隐图像空间进行采样以创建全新的图像或编辑现有图像是目前创作AI最受欢迎和最成功的应用方式. 图像隐空间取样 图像生成的关键思想是开发表示的低维潜在空间(自然是矢量空间),其中 ...

  6. PostgreSQL安装和配置---Ubuntu

    PostgreSQL安装和配置---Ubuntu

  7. ILSVRC2016目标检测任务回顾——视频目标检测(VID)

    转自知乎<深度学习大讲堂> 雷锋网(公众号:雷锋网)按:本文作者王斌,中科院计算所前瞻研究实验室跨媒体计算组博士生,导师张勇东研究员.2016年在唐胜副研究员的带领下,作为计算所MCG-I ...

  8. scala学习——(1)scala基础(上)

    scala> val x = 1 x: Int = 1 一.值与变量 值(val):赋值后不可变 val值名称:类型 = XXX 变量(var):赋值后可以改变  var变量名称:类型 = XX ...

  9. android全屏

    this.requestWindowFeature( Window.FEATURE_NO_TITLE ); this.getWindow().setFlags(WindowManager.Layout ...

  10. 设计模式 笔记 单例模式 Singleton

    //---------------------------15/04/09---------------------------- //Singleton 单例模式-----对象创建型模式 /* 1: ...