2019.01.22 51nod 1203 JZPLCM(线段树+链表)
传送门
一道很有意思的题。
题意简述:给一个数列,多次询问区间的lcmlcmlcm,答案对1e9+71e9+71e9+7取模。
思路:首先考虑到一个区间的lcmlcmlcm就是其中所有出现过的素数的最大幂的乘积。
因此想到分开维护每一个素数。
然后由于pap^apa对答案原本是有pap^apa自己那么多贡献的,现在考虑将它拆分成p,p2,p3,...,pap,p^2,p^3,...,p^ap,p2,p3,...,pa共aaa个数,每个数有ppp的贡献,那么对于答案的总贡献还是pap^apa的 。
所以我们把每一个数都拆分。
设p=a1k1a2k2...amkmp=a_1^{k_1}a_2^{k_2}...a_m^{k_m}p=a1k1a2k2...amkm
那么我们将它拆成一段二元组(a1,a1),(a12,a1),...,(a1k1,a1),(a2,a2),(a22,a2),...,(a2k2,a2),...,(am,am),(am2,am),...,(amkm,am)(a_1,a_1),(a_1^2,a_1),...,(a_1^{k_1},a_1),(a_2,a_2),(a_2^2,a_2),...,(a_2^{k_2},a_2),...,(a_m,a_m),(a_m^2,a_m),...,(a_m^{k_m},a_m)(a1,a1),(a12,a1),...,(a1k1,a1),(a2,a2),(a22,a2),...,(a2k2,a2),...,(am,am),(am2,am),...,(amkm,am)
第一元表示数的值,第二元表示数的贡献。
然后现在相当于在重构之后的序列里询问区间中所有数的贡献之积,相同的数贡献只能算一次,这不就是HHHHHH的项链吗,于是用链表维护一下即可。
代码:
#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
typedef long long ll;
const int mod=1e9+7,N=50005,M=8e5+5;
int n,m,tot,inv[N],L[M],R[M],pos[N],nxt[M],ans[N],bit[M];
struct Query{int l,r,id;}qry[N];
typedef pair<int,int> pii;
pii val[M];
inline bool cmp(const Query&a,const Query&b){return a.l<b.l;}
inline int mul(int a,int b){return (ll)a*b%mod;}
inline int lowbit(int x){return x&-x;}
inline void update(int x,int v){for(ri i=x;i<=tot;i+=lowbit(i))bit[i]=mul(bit[i],v);}
inline int query(int x){int ret=1;for(ri i=x;i;i-=lowbit(i))ret=mul(ret,bit[i]);return ret;}
int main(){
n=read(),m=read(),inv[1]=1;
for(ri i=2;i<=50000;++i)inv[i]=mul(inv[mod%i],mod-mod/i);
for(ri i=1,x,tmp,lim;i<=n;++i){
x=read();
if(x==1)continue;
lim=sqrt(x),L[i]=tot+1;
for(ri j=2;j<=lim;++j){
if(x==x/j*j){
tmp=j;
while(x==x/j*j)x/=j,val[++tot]=pii(tmp,j),tmp*=j;
}
}
if(x^1)val[++tot]=pii(x,x);
R[i]=tot;
}
fill(bit+1,bit+tot+1,1);
for(ri i=1;i<=tot;++i){
if(pos[val[i].fi])nxt[pos[val[i].fi]]=i;
else update(i,val[i].se);
pos[val[i].fi]=i;
}
for(ri i=1;i<=m;++i)qry[i].l=L[read()],qry[i].r=R[read()],qry[i].id=i;
sort(qry+1,qry+m+1,cmp);
for(ri i=1,j=0;i<=tot;++i){
while(qry[j+1].l==i)++j,ans[qry[j].id]=query(qry[j].r);
update(i,inv[val[i].se]);
if(nxt[i])update(nxt[i],val[nxt[i]].se);
}
for(ri i=1;i<=m;++i)cout<<ans[i]<<'\n';
return 0;
}
2019.01.22 51nod 1203 JZPLCM(线段树+链表)的更多相关文章
- 2019.01.19 bzoj5457: 城市(线段树合并)
传送门 线段树合并菜题. 题意简述:给一棵树,每个节点有bib_ibi个aia_iai民族的人,问对于每棵子树,子树中哪个民族的人最多,有多少人. 思路: 直接上线段树合并,边合并边维护答案即可. ...
- 2019.01.22 bzoj3333: 排队计划(逆序对+线段树)
传送门 题意简述:给出一个序列,支持把ppp~nnn中所有小于等于apa_pap的'扯出来排序之后再放回去,要求动态维护全局逆序对. 思路:我们令fif_ifi表示第iii个位置之后比它大的数的个 ...
- 2019.01.22 hdu5195 DZY Loves Topological Sorting(贪心+线段树)
传送门 题意简述:给出一张DAGDAGDAG,要求删去不超过kkk条边问最后拓扑序的最大字典序是多少. 思路:贪心帮当前不超过删边上限且权值最大的点删边,用线段树维护一下每个点的入度来支持查询即可. ...
- 2019.01.22 bzoj2874: 训练士兵(主席树)
传送门 题意简述:给出一个n∗mn*mn∗m的矩阵n,m≤1e8n,m\le1e8n,m≤1e8,支持矩形加,矩形求和,强制在线. 思路:第一眼二维动态开点线段树,上网去搜有没有这种做法发现会被卡时空 ...
- 2019.01.19 codeforces343D.Water Tree(树剖+ODT)
传送门 ODTODTODT板子题. 支持子树01覆盖,路径01覆盖,询问一个点的值. 思路:当然可以用树剖+线段树,不过树剖+ODTODTODT也可以很好的水过去. 注意修改路径时每次跳重链都要修改. ...
- 51nod 1272 思维/线段树
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1272 1272 最大距离 题目来源: Codility 基准时间限制:1 ...
- Tensorflow学习笔记2019.01.22
tensorflow学习笔记2 edit by Strangewx 2019.01.04 4.1 机器学习基础 4.1.1 一般结构: 初始化模型参数:通常随机赋值,简单模型赋值0 训练数据:一般打乱 ...
- 2019.02.26 bzoj4311: 向量(线段树分治+凸包)
传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...
- 2019.01.20 bzoj3999: [TJOI2015]旅游(树链剖分)
传送门 树链剖分菜题. 题意不清差评. 题意简述(保证清晰):给一棵带权的树,每次从aaa走到bbb,在走过的路径上任意找两个点,求后访问的点与先访问的点点权差的最大值. 思路: 考虑暴力:维护路径的 ...
随机推荐
- 【Android端】代码打包成jar包/aar形式
Android端代码打包成jar包和aar形式: 首先,jar包的形式和aar形式有什么区别? 1.打包之后生成的文件地址: *.jar:库/build/intermediates/bundles/d ...
- 构造,析构 cpp
一 构造析构常识: 1,c++ 处理类,若没有声明,则编译器默认声明构造,拷贝赋值,拷贝构造,析构函数.所有这些函数都是public且inline的. 2,编译器产出的析构函数是非虚函数.(non-v ...
- Redis 非关系性数据库集群的搭建与常用方法
redis 非关系型数据库,内存型数据库,现在大家都不陌生了,无论大中小型企业,都会将redis应用到自己的项目中,以此来减轻数据库的压力 安装步骤: 1.安装gcc 安装c语言的编译环境 yum i ...
- 关于Laravel框架
第1讲-Laravel介绍 1.1 什么是Laravel laravel是目前一个比较主流的框架,现在很多互联网的公司都在使用该框架.该框架的前身是symfony框架 Laravel的定位就是做一个简 ...
- cpio解压initramfs.img
一.解压initramfs.img # mkdir test # cp /boot/initramfs.img /test # cd test # file initramfs.img initram ...
- 如何查看Firefox中保存的登录密码
问:以前使用Firefox浏览器登录一个论坛,并且临时申请了一个账号,在使用Firefox登录时选择让它记住密码了,后来,我忘记了那个论坛的密码,但是可以使用Firefox直接登录.现在能不能查看密码 ...
- PhotoSphereViewer 全景图
1网站地址:http://photo-sphere-viewer.js.org/markers.html#demo 2参数中文地址:https://www.cnblogs.com/big-tree/p ...
- c#devexpres TreeList 最简单显示动态值的应用
为了让数据显示在行内,也为熟练一下devexpress treelist 控件, 查找了很多,最多的是先把数据放在datatable 表里边, 然后赋值给treelist的datasource 的 ...
- 如何在Windows下安装Tomcat服务器
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选服务器.在Windows下安装 ...
- 使用VNC连接管理VPS
本文基于:Kvm+Windows2008 VPS+VNCviewer 有时候遇上IP没设置好,IP被封,调整磁盘,重置windows系统密码等等使用基于VNC的控制台对VPS进行操作是非常方便的. 有 ...