CF1422F Boring Queries(ST表 + 主席树)
CF1422F Boring Queries
#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);}}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]]]);}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;
}
CF1422F Boring Queries(ST表 + 主席树)相关推荐
- 线段树/扫描线问卷调查反馈——Rmq Problem / mex(主席树),Boring Queries(二分+st表+主席树),Colorful Squares(扫描线)
文章目录 Rmq Problem / mex Boring Queries Colorful Squares Rmq Problem / mex luogu4137 对aia_iai建权值线段树 再 ...
- Codeforces Round #675 (Div. 2) F. Boring Queries 区间lcm + 主席树
传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,qqq个询问,每次询问[l,r][l,r][l,r]内的lcmlcmlcm是多少,对1e9+71e9+71e9+7取模. n ...
- bzoj 1699: [Usaco2007 Jan]Balanced Lineup排队【st表||线段树】
要求区间取min和max,可以用st表或线段树维护 st表 #include<iostream> #include<cstdio> using namespace std; c ...
- 【st表/猫树】【堆+贪心】超级钢琴
[描述] 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中A ...
- 【JSOI2016】【st表/猫树】【枚举】灯塔
[题目描述] [思路] 这道题也很不错.首先这道题有O(nlogn)O(n\log n)O(nlogn)做法,但是我不会,我就只会O(nn)O(n \sqrt n)O(nn)+卡常的做法.这道题唯 ...
- CodeForces - 1422F Boring Queries(主席树+线段树/RMQ)
题目链接:点击查看 题目大意:给出 n 个数组成的数组 a ,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 中所有元素的最小公倍数,强制在线 题目分析:首先考虑多个数的最小公倍数该如何 ...
- BZOJ3473:字符串(后缀数组,主席树,二分,ST表)
Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一 ...
- 【无码专区10】第K大查询(双向链表 /主席树+st表)
已自我实现,但还是归入无码专区序列.哈哈哈哈哈 对于my idea部分,我的每一个想法都实现了,可供参考. problem 给定一个 1∼n1\sim n1∼n 的排列和 kkk,求所有 r−l+1≥ ...
- 【BZOJ2588】Count on a tree,主席树维护链+ST表求LCA
传送门 写在前面:一天下来就写了两道主席树的题--(codevs上的一道智障天梯不算) 思路: 才知道原来主席树不仅可以通过dfs序维护子树区间,还可以直接维护一条到根的链-- 我们建好主席树后,每次 ...
最新文章
- Java List与ArrayList 的区别(List list =new Arraylist(); ArrayList<String> arrayList = new ArrayList())
- 模块化以及插件化开发个人设计思路
- 机器学习有很多关于核函数的说法,核函数的定义和作用是什么?
- Sharepoint
- python的django后台管理_python测试开发django-17.admin后台管理
- FastDFS入门步骤
- python排大小函数_python numpy 一些函数 大小排序和统计
- Golang笔记——goroutine(协程)
- 【转载】大规模网站架构实战之体系结构
- 这家大厂手机业务也凉了 改做手表?官方回应让人放心了...
- python外星人入侵游戏图片_外星人入侵,使用python开发的2D游戏
- Sublime Text3 + Golang搭建开发环境
- 未来比较火的计算机领域,【火了】未来十年,中国人才最紧缺的6个专业!
- 计算机硬件知识大赛,计算机知识技能大赛.doc
- VHDL三段式状态机
- 创建服务器站点的步骤,如何自己建立网站 基本步骤和流程有哪些
- 用零知识证明连接多链宇宙
- Java的字面量和符号引用
- (将英尺转换为米)编写程序,读入英尺数,将其转换为米数并显示结果。一英尺等于0.305米。
- [Swift]LeetCode810. 黑板异或游戏 | Chalkboard XOR Game
热门文章
- solidity modifier函数修改器 智能合约开发知识浅学(三)
- 耗时3年,集齐102位中国摄影师,央视这部纪录片BBC也无法超越......
- 18张难以置信的照片,封面这张你就没见过
- 女儿学会走路了,是不是该教她学Python了?
- 80岁COBOL码农:扶我起来,这个bug我会修!
- 数学建模,还得这样学!
- 快手春节活动奖励未到账,被羊毛党投诉上了全国12315平台
- 在真实工作中的编程是怎么样的,与学校里有什么不同?
- 听说你在学习算法?清华教授为你准备了一份独家秘籍!
- python中的星号和乘号_Python 函数中参数前面一个和两个星号(**)的区别