链接: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 ;
}

wannalfy 挑战赛7 E 珂朵莉与GCD (离线+线段树/树状数组)的更多相关文章

  1. Wannafly挑战赛7 E - 珂朵莉与GCD

    题目描述 给你一个长为n的序列a m次查询 每次查询一个区间的所有子区间的gcd的和mod1e9+7的结果 输入描述: 第一行两个数n,m之后一行n个数表示a之后m行每行两个数l,r表示查询的区间 输 ...

  2. Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数

    Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数 题目描述 给你一个长为n的序列a,有n*(n+1)/2个子区间,问这些子区间里面和为完全平方数的子区间个数 输入描述: 第一行一个数n 第 ...

  3. 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)

    洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...

  4. [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解

    参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...

  5. 牛客练习赛7 E 珂朵莉的数列

    珂朵莉的数列 思路: 树状数组+高精度 离散化不知道哪里写错了,一直wa,最后用二分写的离散化 哪位路过大神可以帮我看看原来的那个离散化错在哪里啊 通过代码: import java.math.Big ...

  6. 牛客练习赛9 F - 珂朵莉的约数

    题目描述 珂朵莉给你一个长为n的序列,有m次查询 每次查询给两个数l,r 设s为区间[l,r]内所有数的乘积 求s的约数个数mod 1000000007 输入描述: 第一行两个正整数n,m第二行一个长 ...

  7. 牛客练习赛9 B - 珂朵莉的值域连续段

    题目描述 珂朵莉给你一个有根树,求有多少个子树满足其内部节点编号在值域上连续 一些数在值域上连续的意思即其在值域上构成一个连续的区间 输入描述: 第一行有一个整数n,表示树的节点数.接下来n–1行,每 ...

  8. [洛谷P3987]我永远喜欢珂朵莉~

    [洛谷P3987]我永远喜欢珂朵莉~ 题目大意: 给你\(n(n\le10^5)\)个数\(A_{1\sim n}(A_i\le5\times10^5)\),\(m(m\le5\times10^5)\ ...

  9. 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)

    传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...

随机推荐

  1. java_第一年_JDBC(1)

    JDBC(Java Data Base Connectivity),用于实现java语言编程与数据库连接的API. 数据库驱动:应用程序并不能直接使用数据库,而需要通过相应的数据库驱动程序后再操作数据 ...

  2. Python笔记(二)

    python笔记 函数式编程 函数 函数是Python内建支持一种封装(将大段代码拆成函数) 通过函数的调用,可以将复制的任务分解. 函数式编程(Functional Programming) 计算机 ...

  3. eclipse 逆向生成hbm配置文件及pojo

    1.eclipse配置hibernate环境 由于在公司中不能在线安装jboss Tools,只能简单介绍手动安装 在jboss官网下载对应自己eclipse的压缩包. 在eclipse 中选择Hel ...

  4. 自己动手实现一个html2canvas

    前言 昨天写了新手引导动画的4种实现方式,里面用到了 html2canvas 于是就顺便了解了一下实现思路. 大概就是 利用 svg 的 foreignObject 标签, 嵌入 dom, 最后再利用 ...

  5. java CAS和AQS

    全面了解Java中的CAS机制 https://www.jb51.net/article/125232.htm https://www.cnblogs.com/javalyy/p/8882172.ht ...

  6. 28、周末看电影(每周五自动从top250中随机选取三部电影,并将下载链接发到邮箱里)

      练习介绍   在第3关的一个课后练习里,我们爬取了指定电影的下载链接:在第6关的一个课后练习里,我们存储了豆瓣TOP250的榜单信息.   现在,我们完善这个程序,每周五在存储的榜单中,随机抽三部 ...

  7. 运维LVS-NAT模式理解

    一.LVS-NAT模式的工作原理这个是通过网络地址转换的方法来实现调度的.首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个 后端的真实服务器(RS ...

  8. 深入理解java虚拟机(4)类加载的过程

    类加载的过程 ------------------------------------------------------- 0.如下图所示JVM类加载机制分为5个部分:加载.验证.准备.解析.初始化 ...

  9. 使用 dataset 管理数据(官网)

    ECharts 4 开始支持了 dataset 组件用于单独的数据集声明,从而数据可以单独管理,被多个组件复用,并且可以基于数据指定数据到视觉的映射.这在不少场景下能带来使用上的方便. ECharts ...

  10. WebService简单使用教程

    根据说明书获取信息 代码示例: import com.gyf.weather.ws.ArrayOfString; import com.gyf.weather.ws.WeatherWS; import ...