TJOI2018 数学计算 题解
题目
小豆现在有一个数 \(x\) ,初始值为 \(1\) 。 小豆有 \(Q\) 次操作,操作有两种类型:
\(m\): \(x=x×m\),输出 \(x\mod M\) ;
\(pos\): \(x=x/\) 第 \(pos\) 次操作所乘的数(保证第 \(pos\) 次操作一定为类型 \(1\),对于每一个类型 \(1\) 的操作至多会被除一次),输出 \(x\mod M\) 。
输入格式
一共有 \(t\) 组输入。
对于每一组输入,第一行是两个数字 \(Q,M\) 。
接下来 \(Q\) 行,每一行为操作类型 \(op\) ,操作编号或所乘的数字 \(m\) (保证所有的输入都是合法的)。
输出格式
对于每一个操作,输出一行,包含操作执行后的 \(x\mod M\)的值
样例输入
1
10 1000000000
1 2
2 1
1 2
1 10
2 3
2 4
1 6
1 7
1 12
2 7
样例输出
2
1
2
20
10
1
6
42
504
84
数据范围
对于 \(20\%\) 的数据, \(1≤Q≤500\) ;
对于 \(100\%\) 的数据, \(1≤Q≤10^5,t≤5,M≤10^9\) 。
题解
使用线段树存储区间积, 每次除改回来一个点
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n, p;
struct Tree {
struct Data { int L, r, mul; } data[N << 2];
void build(int v, int L, int r) {
data[v] = (Data){L, r, 1};
if (L == r) return;
int mid = L + r >> 1;
build(v << 1, L, mid), build(v << 1 | 1, mid + 1, r);
}
void update(int v, int A, int b, int k) {
if (data[v].L > b || data[v].r < A) return;
if (A <= data[v].L && data[v].r <= b)
return data[v].mul = 1ll * data[v].mul * k % p, void();
update(v << 1, A, b, k), update(v << 1 | 1, A, b, k);
}
void query(int v, int k) {
k = 1ll * k * data[v].mul % p;
if (data[v].L == data[v].r) return printf("%d\n", k), void();
query(v << 1, k), query(v << 1 | 1, k);
}
} tree;
struct OP { int pos, m; } a[N];
signed main() {
int T;
scanf("%lld", &T);
while (T--) {
scanf("%lld%lld", &n, &p);
tree.build(1, 1, n);
for (int i = 1; i <= n; i++) {
int op, x;
scanf("%lld%lld", &op, &x);
if (op == 1) a[i] = (OP){i, x};
else {
tree.update(1, a[x].pos, i - 1, a[x].m);
a[x] = (OP){0, 0};
}
}
for (int i = 1; i <= n; i++)
if (a[i].pos) tree.update(1, a[i].pos, n, a[i].m);
for (int i = 1; i <= n; i++) a[i] = (OP){0, 0};
tree.query(1, 1);
}
return 0;
}
TJOI2018 数学计算 题解的更多相关文章
- BZOJ5334:[TJOI2018]数学计算——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5334 小豆现在有一个数x,初始值为1. 小豆有Q次操作,操作有两种类型: 1 m: x = x ...
- BZOJ5334: [Tjoi2018]数学计算
BZOJ5334: [Tjoi2018]数学计算 https://lydsy.com/JudgeOnline/problem.php?id=5334 分析: 线段树按时间分治即可. 代码: #incl ...
- [Tjoi2018]数学计算
[Tjoi2018]数学计算 BZOJ luogu 线段树分治 是不是想问为什么不暴力做? 模数没说是质数,所以不一定有逆元. 然后就是要每次build一下把线段树权值init成1, 博猪不知道为什么 ...
- 题解【洛谷P4588】[TJOI2018]数学计算
题目描述 小豆现在有一个数\(x\),初始值为\(1\).小豆有\(Q\)次操作,操作有两种类型: \(1\;m\):\(x=x\times m\)输出\(x\%mod\); \(2\;pos\):\ ...
- 【题解】Luogu P4588 [TJOI2018]数学计算
原题传送门 这题是线段树的模板题 显而易见,直接模拟是不好模拟的(取模后就不好再除了) 我们按照时间来建一颗线段树 线段树初始值都为1,用来维护乘积 第一种操作就在当前时间所对应的节点上把乘数改成m ...
- [BZOJ5334][TJOI2018]数学计算(exgcd/线段树)
模意义下除法若结果仍为整数的话,可以记录模数的所有质因子,计算这些质因子的次幂数,剩余的exgcd解决. $O(n\log n)$但有9的常数(1e9内的数最多有9个不同的质因子),T了. #incl ...
- [TJOI2018]数学计算 线段树
---题面--- 题解: ,,,考场上看到这题,没想到竟然是省选原题QAQ,考场上把它当数学题想了好久,因为不知道怎么处理有些数没有逆元的问题....知道这是线段树后恍然大悟. 首先可以一开始就建出一 ...
- 洛谷P4588 [TJOI2018]数学计算 【线段树】
题目链接 洛谷P4588 题解 用线段树维护即可 #include<algorithm> #include<iostream> #include<cstring> ...
- [洛谷P4588][TJOI2018]数学计算
题目大意:有一个数$x$和取模的数$mod$,初始为$1$,有两个操作: $m:x=x\times m$并输出$x\% mod$ $pos:x=x/第pos次操作乘的数$(保证合法),并输出$x\%m ...
随机推荐
- Pi-star MMDVM双工板介绍
Pi-star MMDVM双工板介绍(2020/2) pi-star里控制模式选择:双工模式(DUPLEX Mode)/单工模式(SIMPLE Mode) 双工板工作频率范围:144-148,219- ...
- 使用Aspose.word (Java) 填充word文档数据(包含图片填充)
Aspose填充word数据 本文介绍了如何使用aspose进行word文档的生成,并提供了工具类供参考. 有问题欢迎 call 微信:905369866,小弟尽力而为..毕竟这玩意没吃透. 目录 A ...
- vs2010静态编译qt5.1.0
本博文参考 http://blog.chinaunix.net/uid-20690340-id-3802197.html 静态库在链接的时候直接写入二进制文件里,这样的好处在于发布的时候无需附带dll ...
- PyQt中QThread多线程的正确用法【待完善】
先贴几篇有意思的讨论 https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong#commento-login-box-container https ...
- mysql字符串类型(TEXT 类型)
TEXT 类型 TEXT 列保存非二进制字符串,如文章内容.评论等.当保存或查询 TEXT 列的值时,不删除尾部空格. TEXT 类型分为 4 种:TINYTEXT.TEXT.MEDIUMTEXT 和 ...
- belongsTo和hasOne的区别
简单的讲就是,没有太大的区别,只是在逻辑上出现的思想的偏差(逻辑的合理性).belongsTo:可以理解为属于hasOne:可以理解为拥有 首先,我们创建两张表.user表 字段 id name pa ...
- Flutter学习笔记(33)--GestureDetector手势识别
如需转载,请注明出处:Flutter学习笔记(33)--GestureDetector手势识别 这篇随笔主要记录的学习内容是GestureDetector手势识别,内容包括识别单击.双击.长按.组件拖 ...
- Java内存溢出OutOfMemoryError的产生与排查
在java的虚拟机异常中,有两个异常是大家比较关心的,一个是StackOverflowError,另一个是OutOfMemoryError.今天我们就来看看OutOfMemoryError是怎么产生的 ...
- 【asp.net core 系列】- 11 Service层的实现样板
0.前言 在<asp.net core 系列>之实战系列中,我们在之前的篇幅中对项目有了一个大概的认知,也搭建了一个基础的项目骨架.那么就让我们继续完善这个骨架,让它更加丰满.这一篇,我将 ...
- AOF文件的写入与同步
在 Redis 中客户端向服务器发送相关写命令请求,这时服务器中有个用于处理这些命令的事件循环进程,对这些命令进行处理,并将相关信息处理的结果反馈给客户端,如:"OK",等.同时, ...