给一个序列,每次给一个长度l,问长度为l的区间中lcm最小的。

题解:因为ai<60,所以以某个点为左端点的区间的lcm只有最多60种的情况,而且相同的lcm区间的连续的。

所以就想到一个n*60*logn的做法,倍增找出每个点的区间lcm情况,然后修改答案……

1-60的lcm的积大于long long,只能把数拆开,然后比较时用log,结果才用这个数的质因数相乘。

问题在于一开始我对于每个点开个20的数组记录60内第几个质数的个数,这样每次常数就要再乘个20,然后就tle……

优化的方法是位运算,因为只会是2,3,5,7的次幂大于1次,单独记录,其他的只会是0次幂和1次幂。

最后作死的两个小错误:33不是质数……,用ln【60】数组记录log的值然而其中对n取对数……

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxn 40000
#define mm 1000000007
#define LL long long
#define inf 100000000000
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define dow(i,l,r) for(int i=r;i>=l;i--)
using namespace std; typedef struct {
int v1;
double v2;
}Big;
Big tree[maxn*];
double ln[maxn];
int f[maxn][],now;
int n,m,maxln,tot=;
LL ans1[maxn],ans2[maxn];
int pri[]={,,,,
,,,,
,,,,
,,,,
,,,,
,,,,}; double calc(int x)
{
double sum=;
rep(i,,tot)
if ((x>>i)&)
sum+=ln[pri[i]];
dow(i,,)
if ((x>>i)&) {
sum+=(i+)*ln[];
break;
}
if ((x>>)&) sum+=*ln[];
else
if ((x>>)&) sum+=*ln[];
else
if ((x>>)&) sum+=ln[]; if ((x>>)&) sum+=*ln[];
else
if ((x>>)&) sum+=ln[]; if ((x>>)&) sum+=*ln[];
else
if ((x>>)&) sum+=ln[]; return sum;
} LL answer(Big x)
{
LL sum=;
rep(i,,tot)
if ((x.v1>>i)&)
sum=sum*pri[i]%mm;
dow(i,,)
if ((x.v1>>i)&) {
sum=sum*pri[i]%mm;
break;
}
if ((x.v1>>)&) sum=sum*%mm;
else
if ((x.v1>>)&) sum=sum*%mm;
else
if ((x.v1>>)&) sum=sum*%mm; if ((x.v1>>)&) sum=sum*%mm;
else
if ((x.v1>>)&) sum=sum*%mm; if ((x.v1>>)&) sum=sum*%mm;
else
if ((x.v1>>)&) sum=sum*%mm; return sum;
} void build(int x,int l,int r)
{
tree[x].v2=inf;
if (l==r) return;
int mid=(l+r)>>;
build(x<<,l,mid);
build(x<<|,mid+,r);
} void change(int x,int l,int r,int ll,int rr,double z)
{
if (tree[x].v2<=z) return;
if (ll<=l && r<=rr) {
tree[x].v1=now;
tree[x].v2=z;
return;
}
int mid=(l+r)>>;
if (ll<=mid) change(x<<,l,mid,ll,rr,z);
if (rr>mid) change(x<<|,mid+,r,ll,rr,z);
} Big ask(int x,int l,int r,int y)
{
if (l==r) return tree[x];
int mid=(l+r)>>;
Big more;
if (y<=mid) more=ask(x<<,l,mid,y);
else more=ask(x<<|,mid+,r,y);
if (more.v2<tree[x].v2) return more;
return tree[x];
} int main()
{
rep(i,,maxn-) ln[i]=log(i);
int tt=;
while (scanf("%d %d",&n,&m)!=EOF) {
++tt;
rep(i,,n) {
f[i][]=;
int k;
scanf("%d",&k);
dow(j,,tot)
if (k%pri[j]==) k/=pri[j],f[i][]+=<<j;
}
maxln=floor(ln[n]/ln[])+;
rep(i,,maxln)
rep(j,,n+-(<<i))
f[j][i]=f[j][i-]|f[j+(<<(i-))][i-];
build(,,n);
rep(i,,n) {
int l=i;
now=;
while (l<=n) {
// printf("!!%d %d\n",now,f[l][0]);
now=now|f[l][];
int r=l;
dow(j,,maxln)
if (r-+(<<j)<=n && !(~((~f[r][j])|now)) ) r=r-+(<<j); change(,,n,l-i+,r-i+,calc(now));
l=r+;
}
} while (m--) {
int j;
scanf("%d",&j);
printf("%lld\n",answer(ask(,,n,j)));
}
}
return ;
}

这种区间答案连续的思想并不是第一次遇见了

【倍增】LCM QUERY的更多相关文章

  1. 刷题总结——Interval query(hdu4343倍增+贪心)

    题目: Problem Description This is a very simple question. There are N intervals in number axis, and M ...

  2. QTREE2 spoj 913. Query on a tree II 经典的倍增思想

    QTREE2 经典的倍增思想 题目: 给出一棵树,求: 1.两点之间距离. 2.从节点x到节点y最短路径上第k个节点的编号. 分析: 第一问的话,随便以一个节点为根,求得其他节点到根的距离,然后对于每 ...

  3. 【HDU 4343】Interval query(倍增)

    BUPT2017 wintertraining(15) #8D 题意 给你x轴上的N个线段,M次查询,每次问你[l,r]区间里最多有多少个不相交的线段.(0<N, M<=100000) 限 ...

  4. [SPOJ913]QTREE2 - Query on a tree II【倍增LCA】

    题目描述 [传送门] 题目大意 给一棵树,有两种操作: 求(u,v)路径的距离. 求以u为起点,v为终点的第k的节点. 分析 比较简单的倍增LCA模板题. 首先对于第一问,我们只需要预处理出根节点到各 ...

  5. HDU4343Interval query 倍增

    去博客园看该题解 题意 给定n个区间[a,b),都是左闭右开,有m次询问,每次询问你最多可以从n个区间中选出多少[L,R]的子区间,使得他们互不相交. n,m<=10^5. 区间下标<=1 ...

  6. SPOJ375 Query on a tree 【倍增,在线】

    题目链接[http://www.spoj.com/problems/QTREE/] 题意:给出一个包含N(N<=10000)节点的无根树,有多次询问,询问的方式有两种1.DIST  a b 求a ...

  7. Query on a tree II 倍增LCA

    You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, ...

  8. spoj 913 Query on a tree II (倍增lca)

    Query on a tree II You are given a tree (an undirected acyclic connected graph) with N nodes, and ed ...

  9. HDU 4343 Interval query(贪心 + 倍增)

    题目链接  2012多校5 Problem D 题意  给定$n$个区间,数字范围在$[0, 10^{9}]$之间,保证左端点严格大于右端点. 然后有$m$个询问,每个询问也为一个区间,数字范围在$[ ...

随机推荐

  1. nginx下pagespeed使用详解

    目录 1.简介 2.安装 2.1脚本安装 查看该脚本的如何使用 使用脚本自动安装 替换以前的nginx 2.2 手动安装 先安装基本依赖 构建pagespeed 重新编译安装nginx 3.配置 3. ...

  2. android学习十二 配置变化

    1.配置变化会终止当前活动,并重建活动 2.配置变化有    2.1  屏幕方向变化    2.2  语言变化    2.3   插到基座等   3. 配置变化应用程序不会清除,上下文对新活动依然有效 ...

  3. 使用git bash编译安装sysbench时遇到的坑

      Preface       When I was compiling the sysbench just now,I encountered some failures in the preced ...

  4. 汽车VIN码,车架号,移动端,服务器端OCR识别 技术公司

    很多人在购买车辆的时候,只关注性能.外观.内饰等,其实真正的内行是首先看车辆的VIN码,也叫车架号码. VIN码(车架号码)是一辆车的唯一身份证明,一般在车辆的挡风玻璃处,有的在车辆防火墙上,或B柱铭 ...

  5. Shader Forge学习

    最近学习了一下shader forge,一个屌屌哒插件用来生成shader.尽管其降低了制作shader的难度,但是真的想做出满意的shader的话还是得有一定的shader基础.但是仅仅是做出一些简 ...

  6. 一篇文章让你了解GC垃圾回收器

    简单了解GC垃圾回收器 了解GC之前我们首先要了解GC是要做什么的?顾名思义回收垃圾,什么是垃圾呢? GC回收的垃圾主要指的是回收堆内存中的垃圾对象. 从根对象出发,所有被引用的对象,都是存活对象 其 ...

  7. 拥抱移动端,jQueryui触控设备兼容插件

    http://touchpunch.furf.com/ ps:要FQ. jQuery UI Touch Punch Touch Event Support for jQuery UI Tested o ...

  8. [Clr via C#读书笔记]Cp11事件

    Cp11事件 类型之所以提供事件通知功能,是因为类型维护了一个已登记方法的列表,事件发生后,类型将通知列表登记的所有方法: 事件模型建立在委托的基础上.委托是调用回调方法的一种类型安全的方式. 设计事 ...

  9. python SyntaxError: Non-ASCII character '\xe8' in file C:\Users\nwpujun\PycharmProjects\projects\hrl1\hrlAgent\src\li_nn.py on line 52

    解决方法:在文件头部加上这样的一句话 # -*- coding: utf-8 -*- 注意:加在其他的位置可能没用,我就是这样的

  10. LeetCode - 13. Roman to Integer - 思考if-else与switch的比较 - ( C++ ) - 解题报告

    1.题目: 原题:Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range ...