SPOJ LGLOVE 7488 LCM GCD Love (区间更新,预处理出LCM(1,2,...,n))
题目连接:http://www.spoj.com/problems/LGLOVE/
题意:给出n个初始序列a[1],a[2],...,a[n],b[i]表示LCM(1,2,3,...,a[i]),即1~a[i]的最小公倍数
然后给出三种操作,注意:0<=i,j<n
0 i j p :a[i]~a[j]都加上p
1 i j :求LCM(b[i],b[i+1],...,b[j])
2 i j :求GCD(b[i],b[i+1],...,b[j])
思路:
求LCM(b[i],b[i+1],...,b[j]),也就是求LCM(1,2,...a[i]),LCM(1,2,...a[i+1]),...,LCM(1,2,...a[j]),这些数的最小公倍数
如果细心的话可以发现,对于LCM(1,2,...,n1),LCM(1,2,...,n2)
假设n1<n2,那么LCM(1,2,...,n2)必定是LCM(1,2,...,n1)的倍数;反过来,LCM(1,2,...,n1)必定是LCM(1,2,...,n2)的约数。
因此针对操作1,其实就是求max(a[i],...,a[j]),设为maxval,然后求出LCM(1,2,...,maxval)即可。
针对操作2,其实就是求min(a[i],...,a[j]),设为minval,然后求出LCM(1,2,...,minval)即可。
到此,线段树方面的已经解决了,也就是只要存储该区间的最大值和最小值就行了。
接下来的话,就是如何预处理出LCM(1,2,...,n)了。
设z[n]=LCM(1,2,...,n),那么我们可以用下面方式来预处理出所有值:
z[n]=LCM(z[n-1],n)
LCM(z[n-1],n)=(z[n-1]*n)/GCD(z[n-1],n)
而如果就按照这个公式这么做的话,由于最后是求模,首先要将除法的求模改成乘逆,即若a=b/c,那么a%mod=b*c^(m-2)%mod,
然后用到快速幂,再用辗转相除法。。。不用说,也知道,肯定会TLE!!!
再深入想想,n可以化为p1^a1 * p2^a2 * ... pk^ak,p1,p2,...,pk为n的质因数
从n的质因式分解中取出一个pi,剩下的设为m,注意m<n,那么n=m*pi
因为z[n-1]=LCM(1,2,...,n-1),而m<=n-1,所以z[n-1]必定是m的倍数,设z[n-1]=a*m这样的话
即转化为 LCM(z[n-1],n)=LCM(z[n-1],m*pi)=z[n-1]*m*pi/GCD(z[n-1],m*pi)
而GCD(z[n-1],m*pi)=m*GCD(a,pi)
所以LCM(z[n-1],n)=z[n-1]*pi/GCD(a,pi)
1.若pi与a互质,即pi是这么一个数:在1~n-1中不存在pi这么个质因数,或者存在了,但是个数不够,还要乘一次
z[n]=z[n-1]*pi
2.若pi与a不互质,即z[n-1]中pi的个数与n中的个数相同,也就是说n中所有的因子都在z[n-1]中了,那么
z[n]=z[n-1]
对于每个质因数,设为p,那么p出现第一次,p^2出现第二次,p^3出现第三次...
那么我们只要在它第i次出现的时候,结果乘上它就行。
具体操作是和素数筛选法同时进行的,还是见代码吧。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define lson rt<<1,L,mid
#define rson rt<<1|1,mid+1,R using namespace std;
const int INF=0x3f3f3f3f;
const int mod=;
const int maxn=;
long long z[maxn*]; //z[i]=LCM(1,2,...,i)
int n,m;
int maxval,minval;
/*
预处理z[i]
z[i]=LCM(1,2,3,...,i) 1<=i<=300000
*/
void init(){
memset(z,,sizeof(z));
z[]=; //0的话,最小公倍数为0
z[]=;
for(int i=;i<maxn*;i++){
if(z[i]==){
for(int j=*i;j<maxn*;j+=i)
z[j]=;
for(int j=i;j<maxn*;j*=i)
z[j]=i; //在i^m 的位置都先设为i,到时只要乘上就行
}
z[i]*=z[i-];
z[i]%mod;
}
} struct Node{
int maxv,minv; //存储区间的最大值,最小值
int add;
int lazy;
}tree[maxn<<]; void pushUp(int rt){
tree[rt].maxv=max(tree[rt<<].maxv,tree[rt<<|].maxv);
tree[rt].minv=min(tree[rt<<].minv,tree[rt<<|].minv);
}
void pushDown(int rt){
if(tree[rt].lazy){
tree[rt<<].add+=tree[rt].add;
tree[rt<<|].add+=tree[rt].add;
tree[rt<<].maxv+=tree[rt].add;
tree[rt<<].minv+=tree[rt].add; //一开始漏写了。。。
tree[rt<<|].maxv+=tree[rt].add; //一开始漏写了。。。
tree[rt<<|].minv+=tree[rt].add;
tree[rt<<].lazy=tree[rt<<|].lazy=true;
tree[rt].lazy=false;
tree[rt].add=;
}
}
void build(int rt,int L,int R){
tree[rt].lazy=false;
tree[rt].add=;
if(L==R){
int v;
scanf("%d",&v);
tree[rt].maxv=tree[rt].minv=v;
return;
}
int mid=(L+R)>>;
build(lson);
build(rson);
pushUp(rt);
} void update(int rt,int L,int R,int l,int r,int c){
if(l<=L&&R<=r){
tree[rt].maxv+=c;
tree[rt].minv+=c;
tree[rt].add+=c;
tree[rt].lazy=true;
return;
}
int mid=(L+R)>>;
pushDown(rt);
if(l<=mid)
update(lson,l,r,c);
if(r>mid)
update(rson,l,r,c);
pushUp(rt);
} void query(int rt,int L,int R,int l,int r,int op){
if(l<=L&&R<=r){
if(op==){
maxval=max(maxval,tree[rt].maxv);
}
else{
minval=min(minval,tree[rt].minv);
}
return;
}
pushDown(rt);
int mid=(L+R)>>;
if(l<=mid)
query(lson,l,r,op);
if(r>mid)
query(rson,l,r,op);
return;
}
int main()
{
init();
int op,a,b,p;
scanf("%d%d",&n,&m);
build(,,n);
for(int i=;i<=m;i++){
scanf("%d",&op);
if(op==){
scanf("%d%d%d",&a,&b,&p);
a++;
b++;
update(,,n,a,b,p);
}
else if(op==){
maxval=-INF;
scanf("%d%d",&a,&b);
a++;b++;
query(,,n,a,b,op);
if(maxval==)
printf("0\n");
else
printf("%lld\n",z[maxval]);
}
else{
minval=INF;
scanf("%d%d",&a,&b);
a++;b++;
query(,,n,a,b,op);
if(minval==)
printf("0\n");
else
printf("%lld\n",z[minval]);
}
}
return ;
}
SPOJ LGLOVE 7488 LCM GCD Love (区间更新,预处理出LCM(1,2,...,n))的更多相关文章
- HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- Can you answer these queries I SPOJ - GSS1 (线段树维护区间连续最大值/最大连续子段和)
You are given a sequence A[1], A[2], ..., A[N] . ( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ). A query is defi ...
- HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...
- hdu 3397 Sequence operation(线段树:区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给你一个长度为n的0,1序列,支持下列五种操作, 操作0(0 a b):将a到b这个区间的 ...
- 【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)
题目0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标.操作2清空[a,b]的花瓶,求清除的花的数量.线段树懒惰标记来更新区间.操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或 ...
- HDU 1698 Just a Hook(线段树/区间更新)
题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS Memory Limit: 32768 K Description In the g ...
- HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...
随机推荐
- Change http port in bitnami stack
My case goes like this. I installed bitnami redmine first with port 80 for http service, but got pro ...
- C#主要支持 5 种动态创建对象的方式
C#主要支持 5 种动态创建对象的方式: 1. Type.InvokeMember 2. ContructorInfo.Invoke 3. Activator.CreateInstance(Type) ...
- Silverlight形状、画笔、变换、图像处理、几何图形
1.形状(Ellipse.Line.Path.Polygon.Polyline 和 Rectangle) <UserControl x:Class="SharpStudy.MainPa ...
- Android:自定义控件样式(Selector)
前言 在开发一个应用程序过程中不可避免的要去修改组件的样式,比如按钮.输入框等.现在就看下如何通过Seletor实现样式的自定义.先看下简单的效果对比
- Android SDK 更新失败
万恶的墙,调查兵团赶紧把墙拆了.大家一起跟巨人打一架. 解决方法是改hosts文件 添加 74.125.237.1 dl-ssl.google.com ok,good job 多亏了http://bl ...
- 扩展 delphi 线程 使之传递参数.
新delphi的线程TThread有了CreateAnonymousThread方法,如果再为它加一个可传递的参数不就更好了吗?代码如下: TAnonymousThreadX<T> = c ...
- php进行多个数组合并zip
$a = array_zip(array("Dog","Cat","Horse"), array(1,2,3), array("l ...
- About Curah
相信下列场景对您来说一点都不陌生:您遇到一个问题,花了好几个小时在网上搜寻解答和可靠的技术内容.即使前往许多技术博客和论坛翻箱倒柜后,还是无法确定要相信谁,也不知道该选哪个答案. Curah! 网站就 ...
- HotSpot Builder Utility安装指南
系统需求硬件- 一台带有1个以太网卡的电脑(宿主机)- 一个无线路由器 软件- VirtualBox 4.1或更高的版本.下载网址:http://www.virtualbox.org/- 我们提供的最 ...
- android----sqlite中的 query() 参数分析
public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, Strin ...