http://acm.hdu.edu.cn/showproblem.php?pid=5726

rmq修改成gcd的,关键是找个数,用二分来找,刚开始理解了好久,因为每个区间内gcd是递减的,所以可以优化暴力枚举。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
using namespace std; int a[],n,dp[][];
map<int,long long> mp;
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
} void rmq_init(int len)
{
for(int i = ;i <= len;i++)
{
dp[i][] = a[i];
} for(int j = ;(<<j) <= len;j++)
{
for(int i = ;i+(<<j)- <= len;i++)
{
dp[i][j] = gcd(dp[i][j-],dp[i+(<<(j-))][j-]);
}
}
} int rmq_query(int l,int r)
{
int k = (int)(log((double)(r-l+))/log(2.0));
return gcd(dp[l][k],dp[r-(<<k)+][k]);
} int main()
{
int T;
scanf("%d",&T);
for(int z = ;z <= T;z++)
{
mp.clear();
printf("Case #%d:\n",z);
scanf("%d",&n);
for(int i = ;i <= n;i++) scanf("%d",&a[i]);
rmq_init(n);
for(int i = ;i <= n;i++)
{
int l = i,r = i;
while(r <= n)
{
int ll = r,rr = n;
int v = rmq_query(l,r);
while(ll <= rr)
{
int mid = (ll+rr)/;
if(rmq_query(l,mid) >= v) ll = mid+;
else rr = mid-;
}
mp[v] += ll-r;
r = ll;
}
}
int t;
scanf("%d",&t);
while(t--)
{
int l,r;
scanf("%d%d",&l,&r);
int ans = rmq_query(l,r);
printf("%d %lld\n",ans,mp[ans]);
}
}
return ;
}

最新文章

  1. Unity、c#中的拓展方法讲解
  2. [BZOJ3751][NOIP2014] 解方程
  3. 操作系统开发系列—11.ELF格式 ●
  4. windows内核编程之常用数据结构
  5. BS架构与CS架构的区别(最全)
  6. PHP开发异步高性能的MySQL代理服务器
  7. listagg( ) within group ( order by ) 与 wm_concat
  8. cadence遇到的问题(持续更新)
  9. Java基础知识强化之IO流笔记07:自定义的异常概述和自定义异常实现
  10. Tcl语言笔记之二
  11. 通过Java反射调用方法
  12. 移动UI
  13. python多线程爬虫设计及实现示例
  14. LINUX 笔记-read命令
  15. SQL 增加列、修改列、删除列
  16. ES5的完美继承
  17. Unity Shader Graph(一)初次尝试
  18. 使用jQuery+huandlebars防止编码注入攻击
  19. uniGUI试用笔记(九)
  20. rsync 通过服务的方式同步 linux系统日志 screen工具

热门文章

  1. 实现antd下拉框动态添加内容(与数据库交互)
  2. tomcat 介绍及环境搭建
  3. ACM北大暑期课培训第六天
  4. Docker系列-第五篇Docker容器数据卷
  5. (1)解锁 MongoDB replica set核心姿势
  6. STL 结构体内重载 一个比较运算符
  7. 切蛋糕(贪心 or 优先队列)
  8. mysql 执行计划和慢日志记录
  9. [bzoj4417] [洛谷P3990] [Shoi2013] 超级跳马
  10. azure 第一弹