试题来源

2012中国国家集训队命题答辩

问题描述

给定一长度为n的正整数序列a,有q次询问,每次询问一段区间内所有数的lcm(即最小公倍数)。由于答案可能很大,输出答案模1000000007。

输入格式

第一行,两个整数,n, q,分别表示数列长度和询问个数。

下面n行,每行一个整数,第i行的整数为ai。

下面q行,每行两个整数l, r,表示询问下标i在[l, r]范围内的ai的lcm。

输出格式

q行。对于每个询问,输出一行,表示对应的答案。

样例输入

3 3

123

234

345

1 2

2 3

1 3

样例输出

9594

26910

1103310

样例说明

我们用1和2来分别表示两种颜色的宝石,则这串项链有四种等概率的情形:1121,1122,1221和1222。它们的幸运度分别是2,2,2,3,因此期望的幸运度是2.25。

数据规模和约定

测试数据编号
规模和约定
1, 2
n, q<=1000
3, 4
n, q<=5000
5, 6
n, q<=20000
7, 8
n, q<=30000
9, 10
n, q<=40000
11, 12
n, q<=50000
13, 14
n, q<=80000
15, 16
n, q<=100000
17, 18, 19, 20
n, q<=100000 数列a中每个数能表示为不超过100的素数的积

对于所有测试点,数列a中每个数满足1题解

求一个区间的 \(lcm\) ,将区间中所有数进行质因数分解,\(lcm\) 就是区间中所有质因数在最大幂次的情况下的乘积

询问离线

将所有数的每个质因子拆成 \(p_i^1,p_i^2,p_i^3,...,p_i^{k_i}\) 物品,用BIT维护区间内最大幂次就好了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=100000+10,Mod=1e9+7;
int n,q,pt,cnt,prime[MAXN],vis[MAXN];
ll ans[MAXN];
std::map<int,int> M;
struct node{
int id,val,num,las;
};
node p[MAXN*35];
struct question{
int id,l,r;
inline bool operator < (const question &A) const {
return r<A.r||(r==A.r&&l<A.l);
};
inline bool operator > (const question &A) const {
return id<A.id;
};
};
question query[MAXN];
struct BIT{
ll C[MAXN];
inline void init()
{
for(register int i=1;i<=n;++i)C[i]=1;
}
inline int lowbit(int x)
{
return x&(-x);
}
inline void add(int x,ll k)
{
if(!x)return ;
while(x<=n)C[x]=1ll*C[x]*k%Mod,x+=lowbit(x);
}
inline ll mul(int x)
{
ll res=1;
while(x>0)res=1ll*res*C[x]%Mod,x-=lowbit(x);
return res;
}
};
BIT T;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void init()
{
memset(vis,1,sizeof(vis));
vis[0]=vis[1]=0;
for(register int i=2;i<MAXN;++i)
{
if(vis[i])prime[++cnt]=i;
for(register int j=1;j<=cnt&&i*prime[j]<MAXN;++j)
{
vis[i*prime[j]]=0;
if(i%prime[j]==0)break;
}
}
}
inline void work(int x,int id)
{
for(register int i=1,lt=std::sqrt(x);i<=cnt&&prime[i]<=lt;++i)
{
int tmp=1;
while(x%prime[i]==0)
{
tmp*=prime[i];
p[++pt]=(node){id,prime[i],tmp,0};
x/=prime[i];
}
}
if(x!=1)p[++pt]=(node){id,x,x,0};
}
inline ll qexp(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1)res=res*a%Mod;
a=a*a%Mod;
b>>=1;
}
return res;
}
int main()
{
read(n);read(q);
init();T.init();
for(register int i=1,x;i<=n;++i)read(x),work(x,i);
for(register int i=1;i<=pt;++i)p[i].las=M[p[i].num],M[p[i].num]=p[i].id;
for(register int i=1;i<=q;++i)
{
int l,r;read(l);read(r);
query[i]=(question){i,l,r};
}
std::sort(query+1,query+q+1);
for(register int i=1,j=1,k=1;i<=n;++i)
{
while(j<=pt&&p[j].id==i)T.add(i,p[j].val),T.add(p[j].las,qexp(p[j].val,Mod-2)),++j;
while(k<=q&&query[k].r==i)ans[query[k].id]=1ll*T.mul(i)*qexp(T.mul(query[k].l-1),Mod-2)%Mod,++k;
}
for(register int i=1;i<=q;++i)printf("%lld\n",ans[i]);
return 0;
}

【刷题】清橙 A1339 JZPLCM(顾昱洲)的更多相关文章

  1. 清橙A1339. JZPLCM(顾昱洲)

    http://www.tsinsen.com/ViewGProblem.page?gpid=A1339 题解:https://blog.csdn.net/LOI_DQS/article/details ...

  2. 清橙A1206.小Z的袜子 && CF 86D(莫队两题)

    清橙A1206.小Z的袜子 && CF 86D(莫队两题) 在网上看了一些别人写的关于莫队算法的介绍,我认为,莫队与其说是一种算法,不如说是一种思想,他通过先分块再排序来优化离线查询问 ...

  3. BZOJ4590 自动刷题机

    Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写 ...

  4. 教你用python写:HDU刷题神器

    声明:本文以学习为目的,请不要影响他人正常判题 HDU刷题神器,早已被前辈们做出来了,不过没有见过用python写的.大一的时候见识了学长写这个,当时还是一脸懵逼,只知道这玩意儿好屌-.时隔一年,决定 ...

  5. 清橙A1212:剪枝

    题面 清橙 Sol 一种新的树上\(DP\)姿势 从左往右按链\(DP\) 做法: 维护两个栈\(S1\),\(S2\) \(S1\)存当前的链 \(S2\)存分叉点以下要改的链 \(Dfs\),弄一 ...

  6. 清橙A1202&Bzoj2201:彩色圆环

    因为Bzoj是权限题,所以可以去清橙做一下 Sol 突然考了一道这样的题,考场上强行\(yy\)出来了 win下评测Long double爆零TAT 首先肯定是破环为链变成序列问题辣 那么就要求第一个 ...

  7. LeetCode刷题专栏第一篇--思维导图&时间安排

    昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...

  8. [清橙A1210]光棱坦克

    [清橙A1210]光棱坦克 题目大意: 平面上放置了\(n(n\le7000)\)个反射装置,光纤将从某个装置出发,在经过一处装置时发生反射,若经过的装置坐标依次为\((x_1,y_1),(x_2,y ...

  9. JS、JAVA刷题和C刷题的一个很重要的区别

    就是最近在做树方面的题时,发现JS和JAVA刷题和C刷题的一个很重要的区别就是传入null的区别 当遍历的时候,C传参数时可以传进去null的指针,因为递归进去,出来时,指针还是指着那个地方 但是JS ...

随机推荐

  1. Swift图书展示项目笔记

    1.Swift语言特点 Extensions(扩展):就是向一个已有的类.结构体.枚举类型或者协议类型添加新功能.这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模) map: 得到一个 ...

  2. 1.6《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——小结

    本章节学过的重要命令整理,见下表Table 2. 命令 描述 例子 echo <string> 向屏幕输出字符串 $ echo hello man <command> 显示命令 ...

  3. 让Visual Studio载入Symbol(pdb)文件

    让Visual Studio载入Symbol(pdb)文件 让Visual Studio载入Symbol(pdb)文件 在VC编译工程的编译连接阶段,会产生Symbol文件,也就是常说的 pdb 文件 ...

  4. 【HNOI2016】序列

    题面 题解 设\([l, r]\)的最小值的位置为\(p\),那么对于左端点在区间\([l, p]\),右端点在区间\([p, r]\)的区间最小值都为\(a[p]\). 这一部分的贡献就是\(a[p ...

  5. (幼儿园毕业)Javascript小学级随机生成四则运算

    软件工程第二次结对作业四则运算自动生成器网页版 一.题目要求 本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题. ...

  6. VMware Tools安装和卸载

    1.卸载 a.查找 vmware-uninstall-tools.pl 路径:sudo find / -name 'vmware-uninstall-tools.pl' b.切换到 vmware-un ...

  7. 带WIFI模块布局布线要点。

    带WIFI模块布局布线要求: 1: RF底部不能铺铜要挖空不能有GND否则RF信号会被耦合掉从而无法发送出去. 2:WIFI模块下方不能打孔尽量不走线不打孔避开其他信号穿过下方,要整体的铺铜 3:连接 ...

  8. (功能篇)回顾Bug管理系统Mantis优化改造经历

    共分为两篇,功能篇和技术篇. 时间大约是2016年冬天. 考虑搭一个用于Bug管理和追踪的系统. 综合比较下,选择了小巧的开源工具,Mantis. 在源码基础上,做代码修改,完成了定制版的优化改造. ...

  9. Catlike学习笔记(1.1)-使用Unity实现一个钟表

    最近发现『Catlike系列教程』觉得内容真的很赞,感觉有很多地方涉及到了我的知识盲点,如果真的可以照着做下来一遍的话应该收获颇丰.因为教程很长所以逐字翻译不太可能了(主要是翻译的太差).基本上就是把 ...

  10. CodeMirror mode编写

    Writing CodeMirror Modes Modes typically consist of a single JavaScript file. This file defines, in ...