题目描述

小豆现在有一个数\(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]数学计算的更多相关文章

  1. 洛谷P4588 [TJOI2018]数学计算 【线段树】

    题目链接 洛谷P4588 题解 用线段树维护即可 #include<algorithm> #include<iostream> #include<cstring> ...

  2. [洛谷P4588][TJOI2018]数学计算

    题目大意:有一个数$x$和取模的数$mod$,初始为$1$,有两个操作: $m:x=x\times m$并输出$x\% mod$ $pos:x=x/第pos次操作乘的数$(保证合法),并输出$x\%m ...

  3. 洛谷P4588 [TJOI2018]数学计算(线段树)

    题意 题目链接 Sol TJOI怎么全是板子题 对时间开个线段树,然后就随便做了.... #include<bits/stdc++.h> using namespace std; cons ...

  4. 【题解】Luogu P4588 [TJOI2018]数学计算

    原题传送门 这题是线段树的模板题 显而易见,直接模拟是不好模拟的(取模后就不好再除了) 我们按照时间来建一颗线段树 线段树初始值都为1,用来维护乘积 第一种操作就在当前时间所对应的节点上把乘数改成m ...

  5. P4588 [TJOI2018]数学计算 (线段树)

    用线段树维护操作序列,叶子结点存要乘的数,非叶子结点存区间乘积,每次输出tr[1] 就是答案. 1 #include<bits/stdc++.h> 2 #define ll long lo ...

  6. 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂

    洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...

  7. 洛谷试炼场-简单数学问题-P1403 [AHOI2005]-因数

    洛谷试炼场-简单数学问题 P1403 [AHOI2005]约数研究 Description 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel I ...

  8. 洛谷试炼场-简单数学问题-P1088 火星人

    洛谷试炼场-简单数学问题 A--P1088 火星人 Description 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...

  9. 洛谷 P4593 [TJOI2018]教科书般的亵渎

    洛谷 P4593 [TJOI2018]教科书般的亵渎 神仙伯努利数...网上一堆关于伯努利数的东西但是没有证明,所以只好记结论了? 题目本质要求\(\sum_{i=1}^{n}i^k\) 伯努利数,\ ...

  10. BZOJ5334: [Tjoi2018]数学计算

    BZOJ5334: [Tjoi2018]数学计算 https://lydsy.com/JudgeOnline/problem.php?id=5334 分析: 线段树按时间分治即可. 代码: #incl ...

随机推荐

  1. 第60届IMO 第5题

    题目   巴斯银行发行的硬币在一面上铸有H,在另一面上铸有T,哈利有枚这样的硬币并将这些硬币从左至 右排成一行,他反复地进行如下操作:如果恰有k(>0)枚硬币H面朝上,则他将从左至右的第k枚硬币 ...

  2. 【巨杉数据库SequoiaDB】社区分享 | SequoiaDB + JanusGraph 实践

    本文来自社区用户投稿,感谢小伙伴的技术分享 项目背景 大家好!在春节这段时间里,由于一直在家,所以花时间捣鼓了一下代码,自己做了 SequoiaDB 和 JanusGraph 的兼容扩展工作. 自己觉 ...

  3. 将Ubuntu软件更新的源,换城阿里源

    阿里云镜像: https://developer.aliyun.com/mirror/ 简介 Ubuntu,是一款基于 Debian Linux 的以桌面应用为主的操作系统,内容涵盖文字处理.电子邮件 ...

  4. PP: Articial Intelligence—TheRevolution Hasn’t HappenedYet

    From Michael I. Jordan As with many phrases that cross over from technical academic fields into gene ...

  5. 五、JVM之堆内存

    堆结构分代图 堆结构分代的意义 Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代.老年代和永久代(对HotSpot虚拟机而言),这就是JVM的内存分代策略. 堆内存是虚拟机管理 ...

  6. C 库函数 - sprintf()

    C 库函数 - sprintf() C 标准库 - <stdio.h> 描述 C 库函数 int sprintf(char *str, const char *format, ...) 发 ...

  7. pytest学习8-运行上次执行失败的用例

    该插件提供了两个命令行选项,用于重新运行上次pytest调用的失败: --lf,--last-failed- 只重新运行上次失败的用例,如果没有失败则全部运行 --ff,--failed-first- ...

  8. Selenium3+python自动化007-Selenium常用定位方法

    自动化测试只要掌握四步操作:获取元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告.元素定位在这四个环节中是至关重要的,如果说按学习精力分配的话,元素定位占70%:操 ...

  9. Appium+python自动化-Android夜神模拟器

    前言 Android SDK虽然也自带了模拟器,但是那速度会让你怀疑人生,并且不稳定经常卡死异常.夜神模拟器可以说是android模拟器里面的一个神器. 环境安装 1.官网下载地址:https://w ...

  10. Python之tcp server模拟Http通信

    1.python tcp server代码: import socket def main(): tcp_server_socket = socket.socket(socket.AF_INET, s ...