GCD

Time Limit: / MS (Java/Others)    Memory Limit: / K (Java/Others)
Total Submission(s): Accepted Submission(s): Problem Description
Give you a sequence of N(N≤,) integers : a1,...,an(<ai≤,,). There are Q(Q≤,) queries. For each query l,r you have to calculate gcd(al,,al+,...,ar) and count the number of pairs(l′,r′)(≤l<r≤N)such that gcd(al′,al′+,...,ar′) equal gcd(al,al+,...,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(<ai≤,,). 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 ). For each query, you need to output the two numbers in a line. The first number stands for gcd(al,al+,...,ar) and the second number stands for the number of pairs(l′,r′) such that gcd(al′,al′+,...,ar′) equal gcd(al,al+,...,ar). Sample Input Sample Output
Case #:
/*
难点在于计数,关键要发现gcd的递减性
对于1到n的(l,r)
对于固定的l
gcd(l,r)>=gcd(l,r+1)
对于固定的r
gcd(l,r)<=gcd(l+1,r)
因此可以不用逐一地进行计数
方法为:
枚举每一个左区间,对满足gcd(l,ri)的右区间进行二分查找
跳跃着进行计数
*/
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <map>
#include <vector>
#define scan1(x) scanf("%d",&x)
#define scan2(x,y) scanf("%d%d",&x,&y)
#define scan3(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const int Max=1e6+;
int dp[Max][];
map<int,LL> vis;
int A[Max];
int gcd(int x,int y)
{
if(x<y) swap(x,y);
return (y==?x:gcd(y,x%y));
}
void RMQ_init(int n)
{
for(int i=; i<=n; i++) dp[i][]=A[i];
for(int j=; (<<j)<=n; j++)
{
for(int i=; i+(<<j)-<=n; i++)
{
dp[i][j]=gcd(dp[i][j-],dp[i+(<<(j-))][j-]);
}
}
}
int RMQ(int l,int r)
{
int k=;
while((<<(k+))<=r-l+) k++;
return gcd(dp[l][k],dp[r-(<<k)+][k]);
}
void Init()
{
vis.clear();
}
int L[Max],R[Max];
int main()
{
int T,ca=;
for(scan1(T); T; T--)
{
int n,m,num;
scan1(n);
for(int i=; i<=n; i++) scan1(A[i]);
RMQ_init(n);
Init();
scan1(m);
for(int i=; i<=m; i++)
{
scan2(L[i],R[i]);
num=RMQ(L[i],R[i]);
vis.insert(make_pair(num,));
}
int l,r,mid,d1,d2,ans,nex;
for(int i=; i<=n; i++)
{
nex=i;
while(nex<=n)
{
d1=RMQ(i,nex);
l=nex;r=n;
while(l<=r)
{
mid=(l+r)>>;
d2=RMQ(i,mid);
if(d2>=d1) l=mid+,ans=mid;
else r=mid-;
}
if(vis.find(d1)!=vis.end())
vis[d1]+=(ans-nex)+;
nex=r+;
}
}
printf("Case #%d:\n",ca++);
for(int i=; i<=m; i++)
{
ans=RMQ(L[i],R[i]);
printf("%d %lld\n",ans,vis[ans]);
}
}
return ;
}

hdu 5726(二分)的更多相关文章

  1. HDU 5726 GCD 区间GCD=k的个数

    GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  2. hdu 4024 二分

    转自:http://www.cnblogs.com/kuangbin/archive/2012/08/23/2653003.html   一种是直接根据公式计算的,另外一种是二分算出来的.两种方法速度 ...

  3. HDU 5726 GCD (RMQ + 二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5726 给你n个数,q个询问,每个询问问你有多少对l r的gcd(a[l] , ... , a[r]) ...

  4. HDU 5726 GCD(RMQ+二分)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5726 题意:给出一串数字,现在有多次询问,每次询问输出(l,r)范围内所有数的gcd值,并且输出有多 ...

  5. hdu 5726 GCD 倍增+ 二分

    题目链接 给n个数, 定义一个运算f[l,r] = gcd(al, al+1,....ar). 然后给你m个询问, 每次询问给出l, r. 求出f[l, r]的值以及有多少对l', r' 使得f[l, ...

  6. HDU 5726 GCD (2016多校、二分、ST表处理区间GCD、数学)

    题目链接 题意 : 给出一个有 N 个数字的整数数列.给出 Q 个问询.每次问询给出一个区间.用 ( L.R ) 表示.要你统计这个整数数列所有的子区间中有多少个和 GCD( L ~ R ) 相等.输 ...

  7. rmq +二分暴力 hdu 5726

    参考博客 题意:n 个数字的数列,有m个询问:求出  L   到   R 的  gcd(最大公约数 ),然后问这整个序列中有多少个区间的  gcd  和这个一样. 分析:L 到  R的gcd直接用RM ...

  8. hdu 5726 GCD 暴力倍增rmq

    GCD/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence ...

  9. hdu 1669(二分+多重匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1669 思路:由于要求minimize the size of the largest group,由此 ...

随机推荐

  1. IOS简单的字串替换方法stringByTrimmingCharactersInSet 和空格的替换 ()

    NSString *str = @"一个 (ABC) #@!#^#G@#Dd21e12d!E@!212s012yhsn 汉0932字#@!中..文//>?输~~~@#$#@%#^#^% ...

  2. 【python】django-celery 实现django项目定时任务

    官方:https://pypi.python.org/pypi/django-celery/ 参考:http://www.weiguda.com/blog/73/ 参考:http://www.liao ...

  3. The Magic only works with total devotion of one's heart

    The Magic only works with total devotion of one's heart All tools and equipments are useless without ...

  4. windows 10启动盘制作工具

    Rufus 官方网站:http://rufus.akeo.ie/

  5. margin:0 auto在IE中失效的解决方案

    转自:http://www.cnblogs.com/hongchenok/archive/2012/11/29/2795041.html 最近在开发项目的时候,发现在火狐浏览器中设置外容器margin ...

  6. Oracle 查询系统所有用户信息

    1.查看所有用户:select * from dba_users;   select * from all_users;   select * from user_users; 2.查看用户或角色系统 ...

  7. 用asp.net c# HttpWebRequest获取网页源代码

    public string GetPage(string url) { HttpWebRequest request = null; HttpWebResponse response = null; ...

  8. CmdBuild

    cmdBuild官网地址:http://www.cmdbuild.org/it 下载.功能和安装说明:http://www.cmdbuild.org/en/download 扩展组件: shark-c ...

  9. mysql事件定时

    DELIMITER $$ MONTH STARTS '2013-01-07 11:20:00' ON COMPLETION PRESERVE ENABLE DO BEGIN CALL ps(); EN ...

  10. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...