cfF. Boring Queries

题意:

n个数组a[],q个询问,每次询问区间[l,r]的lcm值
题目要求强制在线
1<=n<=1e5
1<=a<=2e5
1<=q<=1e5

题解:

添加链接描述
添加链接描述
添加链接描述

我们一般求lcm都是直接通过ab/gcd(a,b)来做,但是现在要对所有lcm取模,且a,b都比较大,就不能直接通过这个计算了,我们开始挖掘lcm更深层的内涵。
a
b/gcd(a,b)的作用其实是对a,b的每个质因子的幂次都取了max,就是说,如果a=p1x1∗p2x2.....∗pnxna=p_{1}^{x1}*p_{2}^{x2}.....*p_{n}^{xn}a=p1x1​∗p2x2​.....∗pnxn​,b=p1y1∗p2y2.....∗pnynb=p_{1}^{y1}*p_{2}^{y2}.....*p_{n}^{yn}b=p1y1​∗p2y2​.....∗pnyn​,那么lcm(a,b)=p1max(x1,y1)∗p2max(x2,y2).....∗pnmax(xn,yn)lcm(a,b)=p_{1}^{max(x1,y1)}*p_{2}^{max(x2,y2)}.....*p_{n}^{max(xn,yn)}lcm(a,b)=p1max(x1,y1)​∗p2max(x2,y2)​.....∗pnmax(xn,yn)​
也就是我们可以通过维护质因子的个数,来求lcm
现在我们开始考虑质因子的个数,因为ai<=2e5,所以对于质因子p,如果p2p^2p2>2e5,那么它出现的次数只有0/1,那查询一个区间内除重后的这些数的乘积。为了减少空间开支,我们可以用主席树来维护这这些质因子,但是一个区间内有可能出现多个相同质因子,该如何处理?
我们参考P1972 [SDOI2009]HH的项链中主席树的操作,对于右端点为r的区间[…,r],相同数字,我们只维护最靠近r的(对每个因子维护一个最后出现的乘积,这样就不会重复计算)。

如果p2p^2p2<2e5,最多只有86个质数,那么可以用87个线段树来维护区间max,因为本题并没有涉及修改,rmq问题可以用st表来实现,维护86个RMQ表
复杂度是O(86∗nlogn)O(86*nlogn)O(86∗nlogn)

个人思考:
我感觉分块不能做,多个数的lcm不是所有数的乘积除以所有数的gcd,就比如4 ,8,3
O(86∗nlogn)O(86*nlogn)O(86∗nlogn)常数偏大,但是能过,还有O(nlog2n)O(nlog^2n)O(nlog2n)的做法,之后更新

代码:

#include <bits/stdc++.h>using namespace std;const int N= 1e5 + 10, M= 2e5 + 10, mod= 1e9 + 7;int root[N], ls[N * 40], rs[N * 40], sum[N * 40], num;int prime[N], Log[N], inv[M], pre[M], fac[M], a[N], cnt, n, m;vector<int> p[87];bool st[M];struct RMQ
{char f[N][18];void init(){for (int j= 1; j < 18; j++) {for (int i= 1; i + (1 << j) - 1 <= n; i++) {f[i][j]= max(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);}}}int query(int l, int r){int s= Log[r - l + 1];return max(f[l][s], f[r - (1 << s) + 1][s]);}
} rmq[87];void init()
{inv[1]= 1;for (int i= 2; i < M; i++) {inv[i]= 1ll * (mod - mod / i) * inv[mod % i] % mod;if (!st[i]) {prime[++cnt]= i;}for (int j= 1; j <= cnt && 1ll * i * prime[j] < M; j++) {st[i * prime[j]]= 1;if (i % prime[j] == 0) {break;}}}for (int i= 2; i < N; i++) {Log[i]= Log[i / 2] + 1;}for (int j= 1; prime[j] * prime[j] < M; j++) {for (int i= 1; i <= n; i++) {while (a[i] % prime[j] == 0) {a[i]/= prime[j];rmq[j].f[i][0]++;}}rmq[j].init();for (int cur= 1; cur < M; cur*= prime[j]) {p[j].push_back(cur); //第j个质数所对应的各种次幂}}for (int i= 87; i <= cnt; i++) {for (int j= prime[i]; j < M; j+= prime[i]) {fac[j]= prime[i];}}
}void build(int& rt, int l, int r)
{rt= ++num;if (l == r) {sum[rt]= 1;return;}int mid= l + r >> 1;build(ls[rt], l, mid);build(rs[rt], mid + 1, r);sum[rt]= sum[ls[rt]] * sum[rs[rt]];
}void update(int& rt, int pre, int l, int r, int x, int v)
{rt= ++num;ls[rt]= ls[pre];rs[rt]= rs[pre];sum[rt]= 1ll * sum[pre] * v % mod;if (l == r) {return;}int mid= l + r >> 1;if (x <= mid) {update(ls[rt], ls[pre], l, mid, x, v);}else {update(rs[rt], rs[pre], mid + 1, r, x, v);}
}int query(int rt, int l, int r, int L, int R)
{if (l >= L && r <= R) {return sum[rt];}int ans= 1, mid= l + r >> 1;if (L <= mid) {ans= 1ll * ans * query(ls[rt], l, mid, L, R) % mod;}if (R > mid) {ans= 1ll * ans * query(rs[rt], mid + 1, r, L, R) % mod;}return ans;
}int main()
{// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d", &n);for (int i= 1; i <= n; i++) {scanf("%d", &a[i]);}init();build(root[0], 1, n);for (int i= 1; i <= n; i++) {root[i]= root[i - 1];if (!fac[a[i]]) {continue;}update(root[i], root[i], 1, n, i, fac[a[i]]);if (pre[fac[a[i]]]) {update(root[i], root[i], 1, n, pre[fac[a[i]]], inv[fac[a[i]]]); //将上个位置的fac[a[i]]去掉}pre[fac[a[i]]]= i;}scanf("%d", &m);int ans= 0;for (int i= 1, l, r; i <= m; i++) {scanf("%d %d", &l, &r);l= (ans + l) % n + 1, r= (ans + r) % n + 1;if (l > r) {swap(l, r);}ans= 1;for (int j= 1; j <= 86; j++) {ans= 1ll * ans * p[j][rmq[j].query(l, r)] % mod;}ans= 1ll * ans * query(root[r], 1, n, l, r) % mod;printf("%d\n", ans);}return 0;
}

cfF. Boring Queries相关推荐

  1. CodeForces - 1422F Boring Queries(主席树+线段树/RMQ)

    题目链接:点击查看 题目大意:给出 n 个数组成的数组 a ,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 中所有元素的最小公倍数,强制在线 题目分析:首先考虑多个数的最小公倍数该如何 ...

  2. CF1422F Boring Queries(ST表 + 主席树)

    CF1422F Boring Queries 给定一个长度为nnn的数组a,(1≤ai≤2×105)a,(1 \leq a_i \leq 2 \times 10 ^ 5)a,(1≤ai​≤2×105) ...

  3. Codeforces Round #675 (Div. 2) F. Boring Queries 区间lcm + 主席树

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,qqq个询问,每次询问[l,r][l,r][l,r]内的lcmlcmlcm是多少,对1e9+71e9+71e9+7取模. n ...

  4. 线段树/扫描线问卷调查反馈——Rmq Problem / mex(主席树),Boring Queries(二分+st表+主席树),Colorful Squares(扫描线)

    文章目录 Rmq Problem / mex Boring Queries Colorful Squares Rmq Problem / mex luogu4137 对aia_iai​建权值线段树 再 ...

  5. 主席树 ---- CF 1422F. Boring Queries(由离线推出在线如何求的 ,求解多次询问的区间LCM)

    题目链接 题目大意: 给你nnn个数, 每次往第iii个数里面里面乘aaa,问你这nnn个数的LCM\text{LCM}LCM是多少? 解题思路: 多个数的lcm不是所有数的乘积除以所有数的gcd,如 ...

  6. Codeforces1422 F.Boring Queries(根号分治+线段树+可持久化线段树)

    题意: 解法: 如果问题可以离线,那么莫队可以直接冲过去,可惜离不得. 每个数最多只有一个>sqrt的质因子,sqrt(2e5)<90, 开90棵线段树分别维护前90个质因子的区间最大指数 ...

  7. Codeforces Round #675 (Div. 2)——F主席树待补?

    A - Fence 把凑得那条边当成最长的边,如果a+b+c=d那么将会共线,只要稍微a+b+c大一点即可满足四边形. #define IO ios::sync_with_stdio(false);c ...

  8. 2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6336 Problem E. Matrix from Arrays Time Limit: 4000/20 ...

  9. 【原】YUI压缩与CSS media queries下的bug

    大概是上个月,使用YUI压缩一个css文件后,发现只要是被压缩后的css文件有部分根本无法工作,一直都不知啥问题引起的,让我感到头疼. 今天发现了只要是在媒体查询中的样式无法起作用,于是才开始怀疑是m ...

最新文章

  1. Python3--爬取数据之911网站信息爬取
  2. 关于百度网盘限速第三方客户端的提醒
  3. GridView Bind 短日期 格式
  4. 马斯克发布脑机接口重大突破:蓝牙连接,一小时植入,已获FDA认证,人体实验在即...
  5. lucene 多个分词查找_使用Lucene的新FreeTextSuggester查找长尾建议
  6. JIRA 5.0.1 发布
  7. linux shell sleep/wait(转载)
  8. 真首发!雷军预热小米12:第一时间把最新最酷的科技带给用户
  9. Oracle Spatial 创建空间表、添加空间原表信息、添加删除空间索引
  10. 2021第一场教师招聘考试3.28开始!一个月备考来得及吗?
  11. IE7 绝对定位z-index问题
  12. Java开发笔记(一百五十)C3P0连接池的用法
  13. Infosys:印度信息技术巨头公司
  14. Mysql数据库Sql语句更改主键设置
  15. 参考文献格式字号字体_参考文献标准格式字体
  16. 【java模板引擎】-beetl
  17. Oracle中insert into select和select into from的用法
  18. 深度学习基础6(微分,偏导,梯度,链式法则)
  19. 得力计算机怎么用二进制,如何将得力计算器 DL-1529 调到保留两位小数点?
  20. 阿里巴巴Java开发手册(部分)-黄山

热门文章

  1. “凡尔赛文学”疯狂刷屏!数学家们也拼命“装”了起来,哈哈哈哈哈
  2. 入坑机器学习?送你一篇麻省博士的学习心得
  3. 你感兴趣的大学专业真相 | 16万人参与调查,看完80%都哭了
  4. flex布局_Flex布局,真香
  5. 缓存机制 java_缓存机制:java中缓存的原理
  6. java多线程 sycophantic_Java多线程volatile和synchronized总结
  7. php return 变量,php内核笔记–函数返回变量return_value
  8. golang防止MySQL注入_mysql – 如何最大限度地降低golang服务中下游服务中SQL注入的风险?...
  9. itext设置pdf的尺寸_如何获取pdf文档iText 7的页面大小-问答-阿里云开发者社区-阿里云...
  10. [Nginx]location 指令说明