链接:https://www.nowcoder.com/acm/contest/56/E

时间限制:C/C++ 5秒,其他语言10秒

空间限制:C/C++ 716800K,其他语言1433600K
64bit IO Format: %lld

题目描述

给你一个长为n的序列a

m次查询

每次查询一个区间的所有子区间的gcd的和mod1e9+7的结果

输入描述:

第一行两个数n,m
之后一行n个数表示a
之后m行每行两个数l,r表示查询的区间

输出描述:

对于每个询问,输出一行一个数表示答案

输入例子:
5 7
30 60 20 20 20
1 1
1 5
2 4
3 4
3 5
2 5
2 3
输出例子:
30
330
160
60
120
240
100

-->

示例1

输入

5 7
30 60 20 20 20
1 1
1 5
2 4
3 4
3 5
2 5
2 3

输出

30
330
160
60
120
240
100

说明

[1,1]的子区间只有[1,1],其gcd为30
[1,5]的子区间有:
[1,1]=30,[1,2]=30,[1,3]=10,[1,4]=10,[1,5]=10
[2,2]=60,[2,3]=20,[2,4]=20,[2,5]=20
[3,3]=20,[3,4]=20,[3,5]=20
[4,4]=20,[4,5]=20
[5,5]=20
总共330
[2,4]的子区间有:
[2,2]=60,[2,3]=20,[2,4]=20
[3,3]=20,[3,4]=20
[4,4]=20
总共160
[3,4]的子区间有:
[3,3]=20,[3,4]=20
[4,4]=20
总共60
[3,5]的子区间有:
[3,3]=20,[3,4]=20,[3,5]=20
[4,4]=20,[4,5]=20
[5,5]=20
总共120
[2,5]的子区间有:
[2,2]=60,[2,3]=20,[2,4]=20,[2,5]=20
[3,3]=20,[3,4]=20,[3,5]=20
[4,4]=20,[4,5]=20
[5,5]=20
总共240
[2,3]的子区间有:
[2,2]=60,[2,3]=20
[3,3]=20
总共100

备注:

对于100%的数据,有1 <= n , m , ai <= 100000

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

根据一个数的唯一分解,一个r往左边的gcd最多个分成个区间,相同区间内的点到r的gcd是一样的

对于询问(l , r) ,枚举子区间的右端点从l到r,如果子区间右端点为 l到r-1 都处理好了就只需要坐享前面更新的成果,然后更新r为右端点的区间就好了

把询问离线,,因此需要区间更新和区间求和,线段树的就不写了

新学树状数组的区间更新和区间求和,用差分的思想

贴了别人的blog,我也是看了别人的(侵删)http://blog.csdn.net/fsahfgsadhsakndas/article/details/52650026

 #include <bits/stdc++.h>
#define mst(a,b) memset((a),(b), sizeof a)
#define lowbit(a) ((a)&(-a))
#define IOS ios::sync_with_stdio(0);cin.tie(0);
#define MP make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+;
const int maxn=1e5+;
int n,m;
int a[maxn],nx[maxn];
int ans[maxn];
vector<pii>uu[maxn];
int c1[maxn],c2[maxn];
void update(int *bits,int pos,int val){
for(;pos<=n;pos+=lowbit(pos))
bits[pos]=(bits[pos]+val)%mod;
}
int get(int *bits,int pos){
int ret=;
for(;pos;pos-=lowbit(pos))ret=(ret+bits[pos])%mod;
return (ret+mod)%mod;
}
void add(int l,int r,int val){
update(c1,l,val),update(c2,l,1LL*(l-)*val%mod); update(c1,r+,-val),update(c2,r+,-1LL*r*val%mod);
}
int query(int pos){
return (1LL*pos*get(c1,pos)-get(c2,pos)+mod)%mod;
}
int query(int l,int r){
return (query(r)-query(l-)+mod)%mod;
}
int main(){
#ifdef local
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)scanf("%d",&a[i]),nx[i]=i-;
for(int i=;i<=m;++i){
int l,r;scanf("%d%d",&l,&r);
uu[r].push_back(MP(l,i));
}
for(int i=;i<=n;++i){
for(int j=i;j;j=nx[j])a[j]=__gcd(a[j],a[i]); for(int j=i;nx[j];j=nx[j])
while(nx[j]&&a[j]==a[nx[j]])nx[j]=nx[nx[j]]; for(int j=i;j;j=nx[j])add(nx[j]+,j,a[j]); for(int j=;j<uu[i].size();++j){
pii&k = uu[i][j];
ans[k.second]=query(k.first,i);
}
}
for(int i=;i<=m;++i)printf("%d\n",ans[i]);
return ;
}

最新文章

  1. JAXP简介
  2. 一行代码实现js数组去重
  3. 前端性能优化----yahoo前端性能团队总结的35条黄金定律
  4. (null): Linker command failed with exit code 1 (use -v to see invocation)
  5. IOS 入门开发之创建标题栏UINavigationBar的使用(二)
  6. C# chart,有关如何在鼠标移动到Series上时显示节点及数据 (有待继续更新)
  7. redis-2.6.16源码分析之pub-sub系统
  8. 工具使用 eclipse the user operation is waiting for Building Working to be completed。
  9. Linux centos7环境下安装Nginx
  10. JSP第三篇【JavaBean的介绍、JSP的行为--JavaBean】
  11. 企业IT管理员IE11升级指南【9】—— IE10与IE11的功能对比
  12. 基于JavaMail的Java邮件发送:简单邮件发送
  13. Spring initializr使用
  14. fastJson注解@JSONField使用的一个实例
  15. Shell脚本中实现切换用户并执行命令操作【转】
  16. leetcode:Single Number【Python版】
  17. javascript小记-作用域
  18. 用Bluepages来验证intranetId和Password的有效性
  19. 安卓测试之---Monkey
  20. SpringInAction--Bean的作用域

热门文章

  1. phpstorm配合xdebug进行本地调试代码
  2. Python细节(二)小数据池
  3. redis为什么使用单线程 ,还那么快,单线程是怎么实现的
  4. Vue中的组件直接的通信是如何实现的
  5. ECharts 中的事件和行为
  6. AutoLayout and Sizeclasses讲解
  7. 【leetcode 461】. Hamming Distance
  8. shell统计mysql当前连接数
  9. ui自动化之selenium操作(一)环境搭建
  10. DataWorks参数配置