长度为N的正整数序列S,有Q次询问,每次询问一段区间内所有数的lcm(即最小公倍数)。由于答案可能很大,输出答案Mod 10^9 + 7。

 
例如:2 3 4 5,询问[1,3]区间的最小公倍数为2 3 4的最小公倍数 = 12。
Input
第1行:两个整数,N, Q,中间用空格分隔,N为数列长度,Q为询问数量。(2 <= N, Q <= 50000)
第2 - N + 1行:每行1个整数,对应数列中的元素(1 <= S[i] <= 50000)
第N + 2 - N + Q + 1行:每行2个数,l, r,表示询问下标i在[l, r]范围内的S[i]的最小公倍数。(1 <= l <= r <= N)
Output
输出共Q行,对应询问区间的最小公倍数Mod 10^9 + 7。
Input示例
3 3
123
234
345
1 2
2 3
1 3
Output示例
9594
26910
1103310 由于ai很小可以用各种方法乱搞,但这是一道论文题,原题的ai有1e9;
我们考虑这种有关lcm和gcd的题一种常用的处理方法就是分解质因数,这个题我们相当于是要求每个质因子的幂的最大值;
这个就很皮了,因为区间中不同质因子的数量是可能很多的,一个个枚举质因子肯定是假的;
我们可以考虑干这样一个骚操作,我们分解质因数的时候,我们就真的把他分解,比如说这个数有p^q,
那么我们就拆为p^1,p^2,p^3,...,p^q,这么多个数,然后每个数的权值为p,然后问题转化为区间中不同的数的乘积;
这样显然是对的,因为我们假设p这个质因子的最大次幂为q,那么会有p这个数会乘q次,因为有p^1,p^2,p^3...p^q每次都乘了p,满足lcm的定义;
于是我们发现这是一个经典的问题,对于每个数我们肯定是在他第一次出现在区间中的时候计算贡献,那么我们用类似HH的项链和采花的套路,用一个la[i],表示i位置上的数上一次出现的位置;
于是我们变为了询问[l,r]中la[i]<l的数的乘积,我们把询问按照右端点排序用树状数组维护前缀乘积即可,具体实现方法和采花类似;
论文链接里面还有各种做法,以及题目的分析过程
//MADE BY QT666
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
const int N=300050;
const int Mod=1e9+7;
int n,q,la[N],prime[N],tot,vis[N],a[N],b[N*20],v[N*20],tt,st[N],ed[N];
vector<int> p[N];
void pre(){
for(int i=2;i<=100000;i++){
if(!vis[i]) prime[++tot]=i;
for(int j=i;j<=100000;j+=i) vis[j]=1;
}
for(int i=1;i<=tot;i++){
for(int j=prime[i];j<=100000;j+=prime[i]) p[j].push_back(prime[i]);
}
}
struct data{
int l,r,id;
}Q[N];
int last[N];
bool cmp(const data &a,const data &b){
return a.r<b.r;
}
ll tr[N*20],ans[N];
int lowbit(int x){return x&-x;}
void update(int x,ll v){
if(x==0) return;
for(int i=x;i<=tt;i+=lowbit(i)) (tr[i]*=v)%=Mod;
}
ll query(int x){
ll ret=1;
for(int i=x;i;i-=lowbit(i)){
(ret*=1ll*tr[i])%=Mod;
}
return ret;
}
ll qpow(ll x,ll y){
ll ret=1;
while(y){
if(y&1) (ret*=x)%=Mod;
(x*=x)%=Mod;y>>=1;
}
return ret;
}
int main(){
scanf("%d%d",&n,&q);pre();
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
int x=a[i];st[i]=tt+1;
for(int j=0;j<p[a[i]].size();j++){
int y=p[a[i]][j],z=p[a[i]][j];
while(x%y==0){
b[++tt]=z;v[tt]=y;x/=y;z*=y;
}
}
ed[i]=tt;
}
for(int i=1;i<=q;i++){
scanf("%d%d",&Q[i].l,&Q[i].r);
Q[i].l=st[Q[i].l],Q[i].r=ed[Q[i].r],Q[i].id=i;
}
for(int i=1;i<=tt;i++) la[i]=last[b[i]],last[b[i]]=i;
sort(Q+1,Q+1+q,cmp);int l=1;
tr[0]=1;
for(int i=1;i<=tt;i++) tr[i]=1;
for(int i=1;i<=q;i++){
while(l<=Q[i].r){
update(la[l],qpow(v[l],Mod-2)),update(l,v[l]);l++;
}
ans[Q[i].id]=query(Q[i].r)*qpow(query(Q[i].l-1),Mod-2)%Mod;
}
for(int i=1;i<=q;i++) printf("%lld\n",ans[i]);
return 0;
}

51nod 1203 jzplcm的更多相关文章

  1. 2019.01.22 51nod 1203 JZPLCM(线段树+链表)

    传送门 一道很有意思的题. 题意简述:给一个数列,多次询问区间的lcmlcmlcm,答案对1e9+71e9+71e9+7取模. 思路:首先考虑到一个区间的lcmlcmlcm就是其中所有出现过的素数的最 ...

  2. 51 nod 1203 JZPLCM

    原题链接 长度为N的正整数序列S,有Q次询问,每次询问一段区间内所有数的lcm(即最小公倍数).由于答案可能很大,输出答案Mod 10^9 + 7.   例如:2 3 4 5,询问[1,3]区间的最小 ...

  3. 51Nod1203 2012集训队答辩 JZPLCM

    A1339. JZPLCM(顾昱洲) 时间限制:3.0s   内存限制:256.0MB   试题来源 2012中国国家集训队命题答辩 问题描述 给定一长度为n的正整数序列a,有q次询问,每次询问一段区 ...

  4. 【51Nod 1244】莫比乌斯函数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...

  5. 51Nod 1268 和为K的组合

    51Nod  1268  和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...

  6. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  7. 51Nod 1278 相离的圆

    51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...

  8. 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501 dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐. 时间 ...

  9. 【51Nod 1622】【算法马拉松 19C】集合对

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1622 简单题..直接暴力快速幂 #include<cstdio&g ...

随机推荐

  1. kafka原理和实践(一)原理:10分钟入门

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  2. openstack pike 集群高可用 安装 部署 目录汇总

    # openstack pike 集群高可用 安装部署#安装环境 centos 7 史上最详细的openstack pike版 部署文档欢迎经验分享,欢迎笔记分享欢迎留言,或加QQ群663105353 ...

  3. 《Linux命令行与shell脚本编程大全》第二十一章 sed进阶

    本章介绍一些sed编辑器提供的高级特性. 21.1 多行命令 按照之前的知识,所有的sed编辑器命令都是针对单行数据执行操作的. 在sed编辑器读取数据流时,它会基于换行符的位置将数据分成行,一次处理 ...

  4. WeChat 隐私政策

    隐私政策 本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐 ...

  5. JMeter接口测试系列-关联参数

    这里主要记录一下A接口的返回结果经过md5加密之后作为另外B接口的参数,这个问题困扰了很久,找了不少资料,现在把解决方法记录如下: 环境 ①JMeter 3.0 ②前置条件:将fastjson.jar ...

  6. 使用.Net Core+EF7 完成CodeFirst

    emmm,本来想着用Core做一个小项目玩玩的,然后肯定是要用到数据库的, 然后想,啊,要不用CodeFirst,感觉很腻害的样子,于是,一脸天真无邪的我就踏入了一个深不见底的天坑... 本来想着,应 ...

  7. AngularJS 控制器通信

    指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式 基于scope继承的方式 最简单的让控制器之间进行通信的方法是通过scope的继承 ...

  8. 从零开始构建docker基础镜像

    段子 今年基本已经结束了,我问了很多朋友今年挣钱了没?大多朋友都有挣,而且挣得五花八门:有挣个屁的,有挣个锤子的,有挣个毛的,更有甚者挣个妹的,奢侈之极!最恐怖的是挣个鬼的!有的还可以,挣个球,下午我 ...

  9. SQL-PL/SQL基础

    SQL的4GL,对流程控制的支持不够,Oracle的PL/SQL是3GL.加入了流程控制.变量等支持能够在数据库层面上进行程序的设计. PL/SQL的特点 1.支持事务控制和SQL. 2.数据类型在S ...

  10. 诡异的 &quot;password取回&quot; 邮件问题

    大部分系统中都有"找回password"的功能,我们的平台也做了此功能,用户可通过 短信,邮件 找回password. 当中对于邮件找回password的方式遇到奇特的问题.记录下 ...