题解【洛谷P4588】[TJOI2018]数学计算
题目描述
小豆现在有一个数\(x\),初始值为\(1\).小豆有\(Q\)次操作,操作有两种类型:
\(1\;m\):\(x=x\times m\)输出\(x\%mod\);
\(2\;pos\):\(x= x/\)第\(pos\)次操作所乘的数(保证第\(pos\)次操作一定为类型\(1\),对于每一个类型\(1\)的操作至多会被除一次)输出\(x\%mod\);
输入格式
一共有\(t\)组输入(\(t\leq5\));
对于每一组输入,第一 行是两个数字\(Q,mod\)(\(Q\leq100000,mod\leq100000000\));
接下来\(Q\)行,每一行为操作类型\(op\),操作编号或所乘的数字\(m\)(保证所有的输入都是合法的).
输出格式
对于每一个操作,输出一行,包含操作执行后的\(x\%mod\)的值
输入输出样例
输入 #1
1
10 1000000000
1 2
2 1
1 2
1 10
2 3
2 4
1 6
1 7
1 12
2 7
输出 #1
2
1
2
20
10
1
6
42
504
84
说明/提示
对于\(20\%\)的数据,\(1\leq Q\leq500\)
对于\(100\%\)的数据,\(1\leq Q\leq100000\)
题解
这道题目难在思维,难在怎么想到线段树。
暴力模拟很容易想到,但是,在此题中,暴力模拟是错误的!!!
一组\(\texttt{hack}\)数据:
1
2 10
1 99
2 99
输出应为:
9
1
貌似用高精度就可以了,但空间复杂度感人……~~
这里直接讲正解。
用一颗线段树维护操作的区间乘积,如果是\(1\)操作就将当前节点的值改为\(m\),\(2\)操作就把要除的数所在的节点的值改为\(1\)。
输出的话……直接输出线段树根节点的值即可。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define int long long//注意long long
#define itn int
#define gI gi
using namespace std;
inline int gi()//快读
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
return f * x;
}
int t, q, mod, tr[400003], ans;
inline int ls(int p) {return p << 1;}//左儿子
inline int rs(itn p) {return p << 1 | 1;}//右儿子
void modify(int ql, int qr, int z, int l, int r, int p)//修改节点
{
if (l == r && l == ql) {tr[p] = z; return;}//到了叶子节点进行修改
int mid = (l + r) >> 1;
if (ql <= mid) modify(ql, qr, z, l, mid, ls(p));//递归左子树
if (qr > mid) modify(ql, qr, z, mid + 1, r, rs(p));//递归右子树
tr[p] = (tr[ls(p)] % mod * tr[rs(p)] % mod) % mod;//上传节点
return;
}
signed main()
{
t = gi();
while (t--)
{
q = gi(), mod = gi();
for (int i = 1; i <= 400001; i+=1) tr[i] = 1;//注意,本题中不需要建树,只需要把所有节点的值设为1
for (int i = 1; i <= q; i+=1)
{
int op = gi(), m = gi();
if (op == 1) modify(i, i, m, 1, q, 1);//操作1,将第i个点的值修改为m
else modify(m, m, 1, 1, q, 1);//操作2,将第m个点的值修改为1
printf("%lld\n", tr[1]);//输出
}
}
return 0;
}
题解【洛谷P4588】[TJOI2018]数学计算的更多相关文章
- 洛谷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 ...
- 洛谷P4588 [TJOI2018]数学计算(线段树)
题意 题目链接 Sol TJOI怎么全是板子题 对时间开个线段树,然后就随便做了.... #include<bits/stdc++.h> using namespace std; cons ...
- 【题解】Luogu P4588 [TJOI2018]数学计算
原题传送门 这题是线段树的模板题 显而易见,直接模拟是不好模拟的(取模后就不好再除了) 我们按照时间来建一颗线段树 线段树初始值都为1,用来维护乘积 第一种操作就在当前时间所对应的节点上把乘数改成m ...
- P4588 [TJOI2018]数学计算 (线段树)
用线段树维护操作序列,叶子结点存要乘的数,非叶子结点存区间乘积,每次输出tr[1] 就是答案. 1 #include<bits/stdc++.h> 2 #define ll long lo ...
- 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂
洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...
- 洛谷试炼场-简单数学问题-P1403 [AHOI2005]-因数
洛谷试炼场-简单数学问题 P1403 [AHOI2005]约数研究 Description 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel I ...
- 洛谷试炼场-简单数学问题-P1088 火星人
洛谷试炼场-简单数学问题 A--P1088 火星人 Description 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...
- 洛谷 P4593 [TJOI2018]教科书般的亵渎
洛谷 P4593 [TJOI2018]教科书般的亵渎 神仙伯努利数...网上一堆关于伯努利数的东西但是没有证明,所以只好记结论了? 题目本质要求\(\sum_{i=1}^{n}i^k\) 伯努利数,\ ...
- BZOJ5334: [Tjoi2018]数学计算
BZOJ5334: [Tjoi2018]数学计算 https://lydsy.com/JudgeOnline/problem.php?id=5334 分析: 线段树按时间分治即可. 代码: #incl ...
随机推荐
- Educational Codeforces Round 82 (Rated for Div. 2)
题外话 开始没看懂D题意跳了,发现F题难写又跳回来了.. 语文好差,码力好差 A 判第一个\(1\)跟最后一个\(1\)中\(0\)的个数即可 B 乘乘除除就完事了 C 用并查集判一下联通,每个联通块 ...
- redis 安装 集群 主从 哨兵 docker
安装redis 官方文档 docker run -d --net host -v /opt/myconfig/redis/redis.conf:/usr/local/etc/redis/redis.c ...
- PP: Articial Intelligence—TheRevolution Hasn’t HappenedYet
From Michael I. Jordan As with many phrases that cross over from technical academic fields into gene ...
- HTML-入门
HTML——超文本标记语言(Hyper Text Markup Language)html——W3C制定的标准超文本——除了文本,还有图片.视频.音频等丰富的元素标记(标签)——用来展示内容表型:标签 ...
- Python之五:函数
函数会给一段语句块命名,我们可以在任何时候调用它,运行其中的代码 它的一班语法: def fun_name(x): 函数语句体 return a def :说明这是一个函数,我们定义了一个函数: fu ...
- C++->以读或写方式打开一个文件
以读或写方式打开一个文件 #include<iostream.h> //.h以C|非C标准引用库文件 #include<fstream.h> #include<std ...
- php实现简易留言板效果
首先是Index页面效果图 index.php <?php header('content-type:text/html;charset=utf-8'); date_default_timezo ...
- 【JavaScript Weekly】#471 — JANUARY 17, 2020
https://javascriptweekly.com/issues/471 #471 — JANUARY 17, 2020 READ ON THE WEB JavaScript Weekly Ba ...
- 微信小程序weui的使用
大家好,我是前端菜鸟,大家可以叫我惊蛰,今天给大家分享一下在微信小程序中对weui的引入和使用,其他的也不再赘述,文中有不对的还请指正,谢谢. 直入主题: 1.下载weui 进入GitHub http ...
- Failed to restart docker.service: Unit not found 镜像加速
解决方案 以前的安装残留 重新安装 find / -name "docker*" centos8 添加软件源信息 yum-config-manager --add-repo htt ...