题目描述

简要题意: 

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;
}

最新文章

  1. Windows 搭建jdk、Tomcat、eclipse以及SVN、maven插件开发环境
  2. Android 不一样的原生分享
  3. PDO和消息队列的一点个人理解
  4. sql2014 新建用户并登陆
  5. [terry笔记]RMAN综合学习之恢复
  6. struct timespec 和 struct timeval
  7. Android_Intent_passValueForResult
  8. JavaScript基础(二)
  9. C# 6 与 .NET Core 1.0 高级编程 - 37 章 ADO.NET
  10. 统一代码风格工具——editorConfig
  11. windows server 2012 + sql server 2008 r2安装
  12. 【转】嵌入式C语言调试开关
  13. 自学Zabbix3.10.1-事件通知Notifications upon events-媒介类型
  14. Android 官方命令深入分析之Android Debug Bridge(adb)
  15. Java list.remove( )方法需要注意的地方
  16. 移植 Qt 至 tiny210 详细过程
  17. DL_WITH_PY系统学习(第2章)
  18. java.lang.IllegalMonitorStateException异常
  19. adb INSTALL_FAILED_UPDATE_INCOMPATIBLE
  20. Asp.Net Core使用System.Drawing.Common部署到docker报错问题

热门文章

  1. C#中的文本到语音
  2. jooq使用示例
  3. python库--requests
  4. RabbitMQ核心知识总结!
  5. JavaScript循环 — for、for/in、while、do/while
  6. 学生信息管理系统.cpp(大二上)
  7. 基于Tensorflow + Opencv 实现CNN自定义图像分类
  8. 学习PHP中国际化地数字格式处理
  9. PHP的OpenSSL加密扩展学习(一):对称加密
  10. PHP脚本设置及获取进程名