题目链接:http://acm.fzu.edu.cn/problem.php?pid=2224

hdu5869

 //#pragma comment(linker, "/STACK:102400000, 102400000")
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
typedef long long LL;
typedef pair <int, int> P;
const int N = 1e6 + ;
int a[N/ + ], bit[N]; //_pos存的是gcd上一次出现的位置
vector <P> ans[N/ + ]; //存的是以i为右端点的gcd
map <int, int> _pos;
struct query {
int l, r, pos;
bool operator <(const query& cmp) const {
return r < cmp.r;
}
}q[N/ + ];
int res[N/ + ]; //答案 void init(int n) {
_pos.clear();
memset(bit, , sizeof(bit));
for(int i = ; i <= n; ++i) {
ans[i].clear();
}
} int GCD(int a, int b) {
return b ? GCD(b, a % b): a;
} void add(int i, int x) {
for( ; i <= N; i += (i&-i))
bit[i] += x;
} int sum(int i) {
int s = ;
for( ; i >= ; i -= (i&-i))
s += bit[i];
return s;
} int main()
{
int n, m, t;
scanf("%d", &t);
while(t--) {
scanf("%d %d", &n, &m);
init(n);
for(int i = ; i <= n; ++i) {
scanf("%d", a + i);
}
for(int i = ; i <= m; ++i) {
scanf("%d %d", &q[i].l, &q[i].r);
q[i].pos = i;
}
for(int i = ; i <= n; ++i) {
int x = a[i], y = i;
for(int j = ; j < ans[i - ].size(); ++j) {
int gcd = GCD(x, ans[i - ][j].first);
if(gcd != x) {
ans[i].push_back(make_pair(x, y));
x = gcd, y = ans[i - ][j].second;
}
}
ans[i].push_back(make_pair(x, y));
}
sort(q + , q + m + );
int p = ;
for(int i = ; i <= n; ++i) {
for(int j = ; j < ans[i].size(); ++j) {
if(!_pos[ans[i][j].first]) {
add(ans[i][j].second, );
_pos[ans[i][j].first] = ans[i][j].second;
} else {
add(_pos[ans[i][j].first], -);
_pos[ans[i][j].first] = ans[i][j].second;
add(ans[i][j].second, );
}
}
while(i == q[p].r && p <= m) {
res[q[p].pos] = sum(q[p].r) - sum(q[p].l - );
++p;
}
}
for(int i = ; i <= m; ++i) {
printf("%d\n", res[i]);
}
}
return ;
}

最新文章

  1. oracle 实现ID自增
  2. string length()
  3. Tomcat SSL 设置
  4. AlertDialog详解
  5. mac在线恢复教程
  6. js框架——angular.js(2)
  7. java多线程sleep和wait方法的区别
  8. Personal Learning Path of Java——初识Java
  9. mongoose api 图表整理
  10. crontab的两大坑:百分号和环境变量
  11. 返回数组中指定的一列,将键值作为元素键名array_column
  12. DataGridView导出数据到Excel
  13. redis学习(一)——redis介绍及安装
  14. mysql 提示表损坏处理方法
  15. SpringMVC(十七-二十) ModelAttribute 注解
  16. 【GMT43智能液晶模块】例程三:CAN通信实验
  17. RestfulAPI超简单入门
  18. std::max、std::min error C2589: “(”:“::”右边的非法标记,error C2059: 语法错误:“::”
  19. HDFS--大数据应用的基石
  20. 把Excel转换成DataTable,Excel2003+

热门文章

  1. 【mac】【nginx】开机重启
  2. Thinkphp5 的常用连式查询
  3. python getopt模块使用方法
  4. 树莓派开发板入门学习笔记1:[转]资料收集及树莓派系统在Ubuntu安装
  5. meteor 检测运行环境,手机或者桌面
  6. ogre3D学习基础7---材质详解
  7. CodeM美团点评编程大赛初赛A轮
  8. 学习 JSP:第一步Eclipse+Tomcat+jre(配置环境)
  9. P1382 楼房 (扫描线,线段树)
  10. linux下安装firefox