cfF. Boring Queries

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=p1x1p2x2.....pnxn,b=p1y1∗p2y2.....∗pnynb=p_{1}^{y1}*p_{2}^{y2}.....*p_{n}^{yn}b=p1y1p2y2.....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(86nlogn)

个人思考:
我感觉分块不能做,多个数的lcm不是所有数的乘积除以所有数的gcd,就比如4 ,8,3
O(86∗nlogn)O(86*nlogn)O(86nlogn)常数偏大,但是能过,还有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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Educational Codeforces Round 119 (Rated for Div. 2)

D. Exact Change E. Replace the Numbers G. Subsequences Galore 因为1和2的数量最大值不是很多&#xff0c;多了的话可以用3代替&#xff0c;那么枚举1和2的数量然后二分3的数量 int a[110], n; bitset<10> bit; bool ch(int x) {for(int i 1;i < n;i ){int num …

.NET微服务体系结构中为什么使用Ocelot实现API网关

为什么要使用API网关而不是直接通信&#xff1f;在微服务架构中&#xff0c;客户端应用程序通常需要使用来自多个微服务的功能。如果直接执行该消费&#xff0c;则客户端需要处理多个微服务端点以进行呼叫。当应用程序发展并引入新的微服务或更新现有的微服务时会发生什么&…

P2000 拯救世界

P2000 拯救世界 题意&#xff1a; 为了拯救世界&#xff0c;小 a 和 uim 决定召唤出 kkksc03 大神和 lzn 大神。根据古籍记载&#xff0c;召唤出任何一位大神&#xff0c;都需要使用金木水火土五种五行神石来摆一个特定的大阵。而在古籍中&#xff0c;记载是这样的&#xff1…

Codeforces Round #762 (Div. 3)

E. MEX and Increments F. Let’s Play the Hat? G. Unusual Minesweeper H. Permutation and Queries 用个优先队列模拟。 map<int,int>ma; priority_queue<int> q;int main() {int t;scanf("%d", &t);while(t --){int n;scanf("%d", …

基于Jenkins Pipeline的ASP.NET Core持续集成实践

最近在公司实践持续集成&#xff0c;使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署&#xff0c;因此这里总结一下。一、关于持续集成与Jenkins Pipeline1.1 持续集成相关概念互联网软件的开发和发布&#xff0c;已经形成了一套标准流程&#xff0c…

踩不出足迹(牛客练习赛88 )

踩不出足迹(牛客练习赛88 ) 题意&#xff1a; 长度为n的数组a&#xff0c;每个数是一个k位二进制 定义一下操作&#xff1a; 令第一次得到的结果为 a1a_1a1​。你需要从第二个数开始&#xff0c;每次可以选择与上一次得到的结果异或或者同或起来。 问最大值是多少&#xff1f…

Codeforces Round #766 (Div. 2)

D. Not Adding E. Not Escaping F. Not Splitting 直接枚举就行了&#xff0c;原本还想的是素倍数&#xff0c;但是素倍数也不行。 bool dis[N];int main() {int n, x;scanf("%d", &n); int ans -n;while(n --)scanf("%d", &x), dis[x] 1;for(…

编程语言之父谈语言设计,龟叔大赞TypeScript

争论哪门编程语言孰优孰劣&#xff0c;长期以来都是程序员乐此不疲的“娱乐活动”。之所以说是娱乐活动&#xff0c;因为这些争论到最后往往只是各自在发泄情绪&#xff0c;再则就是&#xff0c;脱离使用场景去讨论所谓哪门语言更好并没意义。但如果让编程语言作者坐在一起讨论…

P2656 采蘑菇

P2656 采蘑菇 题意&#xff1a; 有n个点&#xff0c;m个单向边&#xff0c;每个边都有边权&#xff0c;如果经过这个边&#xff0c;可以获得其边权&#xff0c;而其边权会变成原来的p倍(0.1<p<0.8)&#xff0c;向下取整 从s点出发&#xff0c;问最多可以采到的蘑菇 题…

Codeforces Round #764 (Div. 3)

A. Plus One on the Subset B. Make AP C. Division by Two and Permutation D. Palindromes Coloring E. Masha-forgetful F. Interacdive Problem G. MinOr Tree 就是最小值逐步增加到最大值的过程。 int main() {int t;scanf("%d", &t);for(int _ 1;_ <…

你必须知道的 SmartSql

介绍SmartSql MyBatis Cache(Memory | Redis) R/W Splitting Dynamic Repository Diagnostics ......简洁、高效、高性能、扩展性、监控、渐进式开发&#xff01;她是如何工作的&#xff1f;SmartSql 借鉴了 MyBatis 的思想&#xff0c;使用 XML 来管理 SQL &#xff0c;并…

CF785D Anton and School - 2

CF785D Anton and School - 2 题意&#xff1a; 给定一个长度≤210^5由(和)组成的字符串&#xff0c;问有多少个子串&#xff08;可以不连续&#xff09;&#xff0c;前半部分是由(组成后半部分由)组成. 题解&#xff1a; 怎么括号匹配能出这么多题 如何才能不重不漏的选出…

OsharpNS轻量级.net core快速开发框架简明入门教程

OsharpNS官方资源项目地址&#xff1a;https://github.com/i66soft/osharp-ns20演示地址&#xff1a;https://www.osharp.org 直接使用QQ登录可以查看效果文档地址&#xff1a;https://docs.osharp.org 正在完善中....发布博客&#xff1a;https://www.cnblogs.com/guomingfeng…

cf1491C. Pekora and Trampoline

cf1491C. Pekora and Trampoline 题意&#xff1a; 有n个蹦床&#xff0c;每个蹦床有它的弹力值bib_{i}bi​,从i蹦床起跳可以落到ibiib_{i}ibi​的位置上(前提是这个位置有蹦床)&#xff0c;跳完后&#xff0c;蹦床的弹力值会减1&#xff0c; 题解&#xff1a; 对于一个蹦床…

.net core 注入机制与Autofac

本来是要先出注入机制再出 管道 的&#xff0c;哈哈哈……就是不按计划来……这里扯扯题外话&#xff1a;为什么要注入&#xff08;DI&#xff0c;dependency-injection&#xff09;&#xff0c;而不用 new 对象&#xff1f;可能我们都很清楚&#xff0c;new 对象所造成的影响就…

2021 年第十三届四川省 ACM-ICPC 大学生程序设计竞赛

2021 年第十三届四川省 ACM-ICPC 大学生程序设计竞赛 题号题目知识点AChuanpai水题BHotpot贪心CTriangle PendantDRock Paper Scissors队友做的不知道EDon’t Really Like How The Story Ends思维栈FDirection SettingGHourly Coding ProblemHNihongo wa Muzukashii D模拟IMon…

浅析 .Net Core中Json配置的自动更新

Pre很早在看 Jesse 的Asp.net Core快速入门的课程的时候就了解到了在Asp .net core中,如果添加的Json配置被更改了,是支持自动重载配置的,作为一名有着严重"造轮子"情节的程序员,最近在折腾一个博客系统,也想造出一个这样能自动更新以Mysql为数据源的ConfigureSource…

E. Don‘t Really Like How The Story Ends(代码未补)

Don’t Really Like How The Story Ends 题意&#xff1a; 有n个点&#xff0c;m个边&#xff0c;现在要从1号边开始求dfs序&#xff0c;问最少加多少边可以是的dfs序是从1到n&#xff1f; 题解&#xff1a; dfs序的过程中&#xff0c;不走到叶子节点我们是无法回溯的&…

记录美好生活 艹

Red Black Tree 磨磨蹭蹭地写虚树&#xff0c;结果半天没出来。大佬说 二分 求公共节点的lca&#xff0c;一下就出来了  二分就是取那些要变更的点的lca 然后判断这样log^2&#xff0c;好像也可以排序差分区间和弄到log&#xff0c;虚树就是暴力枚举然后换根dp&#xff0c;没…

.NET Core 迁移躺坑记续集--Win下莫名其妙的超时

继上一集.NET Core 迁移躺坑记里说到遇到的各种问题并且弄了n个解决方案之后&#xff0c;特别是对于问题4的解决方案对于切换了HttpClientFactory我用了你家netcore 2.1下专门解决之前HttpClient口病已久的灵丹妙药了&#xff0c;信心满满的上线…..然后挂了&#xff0c;该超时…