GCD

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 5302    Accepted Submission(s): 1908

Problem Description

Give you a sequence of N(N≤100,000) integers : a1,...,an(0<ai≤1000,000,000). There are Q(Q≤100,000) queries. For each query l,r you have to calculate gcd(al,,al+1,...,ar) and count the number of pairs(l′,r′)(1≤l<r≤N)such that gcd(al′,al′+1,...,ar′) equal gcd(al,al+1,...,ar).

Input

The first line of input contains a number T, which stands for the number of test cases you need to solve.

The first line of each case contains a number N, denoting the number of integers.

The second line contains N integers, a1,...,an(0<ai≤1000,000,000).

The third line contains a number Q, denoting the number of queries.

For the next Q lines, i-th line contains two number , stand for the li,ri, stand for the i-th queries.

Output

For each case, you need to output “Case #:t” at the beginning.(with quotes, t means the number of the test case, begin from 1).

For each query, you need to output the two numbers in a line. The first number stands for gcd(al,al+1,...,ar) and the second number stands for the number of pairs(l′,r′) such that gcd(al′,al′+1,...,ar′) equal gcd(al,al+1,...,ar).

Sample Input

1
5
1 2 4 6 7
4
1 5
2 4
3 4
4 4

Sample Output

Case #1:
1 8
2 4
2 4
6 1

Author

HIT

Source

2016 Multi-University Training Contest 1

Recommend

wange2014   |   We have carefully selected several similar problems for you:  6396 6395 6394 6393 6392

线段树求解区间GCD
题意:
给n个数,q次查询,首先问区间[l,r]的gcd(a[l],a[l+1],a[l+2]....a[r-1],a[r]),然后输出与区间[l,r]的gcd相等的区间的个数
第一问用线段树求解区间,第二问就是先预处理出以i为开头的区间的各自的GCD的值,用线段树来维护区间GCD和查询


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int inf=0x3f3f3f3f;
int n;
int num[maxn];
struct segtree{int g[maxn<<2];void build(int i,int l,int r){if(l==r){g[i]=num[l];return ;}int mid=(l+r)>>1;build(i<<1,l,mid);build(i<<1|1,mid+1,r);g[i]=__gcd(g[i<<1],g[i<<1|1]);}int query(int i,int l,int r,int L,int R){if(L<=l&&r<=R)  return g[i];int mid=(l+r)>>1;int ls=0,rs=0;if(L<=mid)ls=query(i<<1,l,mid,L,R);if(R>mid)rs=query(i<<1|1,mid+1,r,L,R);if(!ls) swap(ls,rs);return __gcd(ls,rs);}int search(int i,int l,int r,int L,int R,int cur,int &GCD){if(L<=l&&r<=R){if(__gcd(g[i],GCD)<cur){if(l==r)    return l;else{int mid=(l+r)>>1,ls=0,rs=0;ls=search(i<<1,l,mid,L,R,cur,GCD);if(ls)  return ls;rs=search(i<<1|1,mid+1,r,L,R,cur,GCD);return rs;}}else{GCD=__gcd(g[i],GCD);return 0;}}int mid=(l+r)>>1,ls=0,rs=0;if(L<=mid)  ls=search(i<<1,l,mid,L,R,cur,GCD);if(ls)  return ls;if(R>mid)rs=search(i<<1|1,mid+1,r,L,R,cur,GCD);return rs;
}
}seg;map<int ,ll>M;
int main()
{int T,Case=1;scanf("%d",&T);while(T--){M.clear();scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&num[i]);}seg.build(1,1,n);int GCD,nex;for(int i=1;i<=n;i++){int g=seg.query(1,1,n,i,n);for(int now=i,cur=num[i];now<=n;){if(g==cur){M[g]+=n-now+1;break;}GCD=num[i];nex=seg.search(1,1,n,i,n,cur,GCD);M[cur]+=nex-now;now=nex;cur=__gcd(num[now],cur);}}int q;scanf("%d",&q);printf("Case #%d:\n",Case++);int a,b,ans;for(int i=1;i<=q;i++){scanf("%d%d",&a,&b);ans=seg.query(1,1,n,a,b);printf("%d %lld\n",ans,M[ans]);}}return 0;
}

HDU5726 线段树求解区间GCD相关推荐

  1. Can you answer these queries V SPOJ - GSS5 (分类讨论+线段树维护区间最大子段和)

    recursion有一个整数序列a[n].现在recursion有m次询问,每次她想知道Max { A[i]+A[i+1]+...+A[j] ; x1 <= i <= y1 , x2 &l ...

  2. 【HDU - 5875】Function(线段树,区间第一个小于某个数的数 或 RMQ二分)

    题干: The shorter, the simpler. With this problem, you should be convinced of this truth.        You a ...

  3. Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)

    题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...

  4. szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]

    寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...

  5. CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换,清晰易懂)

    CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换)   首先一共有四个操作,第一个和第四个都是线段树的基本操作,直接用线段树实现.      第 ...

  6. 线段树维护区间最大值+第 45 届(ICPC)亚洲区域赛(昆明)L题Simone and Graph Coloring

    题意: 给你n个数的序列,当满足i<ji<ji<j andandand ai>aja_i>a_jai​>aj​时,这两个点之间有一条边,现在对点染色,要求每个点相邻 ...

  7. BZOJ1018 | SHOI2008-堵塞的交通traffic——线段树维护区间连通性+细节

    [题目描述] BZOJ1018 | SHOI2008-堵塞的交通traffic 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列 ...

  8. 【HDU - 1698】 Just a Hook(线段树模板 区间覆盖更新(laz标记) + 区间和查询 )

    题干: In the game of DotA, Pudge's meat hook is actually the most horrible thing for most of the heroe ...

  9. java-HDU1698(线段树的区间更新,和区间查询)

    HDU1698: 题目意思: Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

最新文章

  1. 推荐几个超NB的技术公号!
  2. 数据蒋堂 | JOIN提速 - 外键指针的衍生
  3. win messenger启动随outlook explorer
  4. vue实现pdf导出,解决生成canvas模糊等问题
  5. 服务器不响应Ajax,web前端:解决在IE11浏览器下,JQuery的AJAX方法不响应问题
  6. WorkFlow4.0--入门到精通系列-专题索引
  7. linux gcc中sin30度,学习gcc.pdf
  8. php 输出缓冲区清理
  9. Rails Security (上)
  10. 智伴机器人三级分销模式_企业选择微信三级分销定制开发原因?
  11. Vue实现简书导航栏效果
  12. [ZT]C#的多线程机制探索(1)
  13. Python核心编程(第三版)课后习题解答——第二章
  14. 计算机网络知识点全面总结(有这一篇就够了!!!)
  15. SAP补提折旧-折旧的增加/减少
  16. 基于C++的即时通信软件设计
  17. 超低功耗MCU 的网站
  18. 美国近年来推进“新基建”的布局及启示
  19. Matplotlib做动图(基础版)
  20. jq设置保留两位小数_js保留两位小数方法总结

热门文章

  1. iptables下开放ftp连接端口
  2. Bootstrap-Other:UI 编辑器
  3. ES6——class
  4. [异常解决] android studio检测不到手机的解决办法——ADB驱动自己安装
  5. Daily Report 2012/11/09 陈伯雄(step 9)
  6. ARCHLinux SETUP WITH FDISK
  7. 斯特林数第一类数的应用 hdu3625
  8. JSF优点(转载自中国IT实验室)
  9. jquery ajax html方法吗,jQuery ajax方法
  10. python界面开发pyqt_Python2.7+PyQt4进行界面开发