题目描述

小豆现在有一个数 x ,初始值为 1 。 小豆有 Q 次操作,操作有两种类型:

1 m: x=x×m ,输出 xmodM ;

2 pos: x=x/ 第 pos 次操作所乘的数(保证第 pos 次操作一定为类型 1,对于每一个类型 1 的操作至多会被除一次),输出 xmodM 。

Input

一共有 t 组输入。

对于每一组输入,第一行是两个数字 Q,M 。

接下来 Q 行,每一行为操作类型 op ,操作编号或所乘的数字 m (保证所有的输入都是合法的)。

Output

对于每一个操作,输出一行,包含操作执行后的 xmodM 的值

Example

样例输入

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

Hint

对于 20% 的数据, 1≤Q≤500 ;

对于 100% 的数据, 1≤Q≤105,t≤5,M≤109 。

分析

这道题最简单的做法应该就是线段树了

对于第i次操作

如果是操作1,我们将编号为i的节点乘m,维护一个单点修改,最后输出区间乘积

如果是操作2,我们把编号为i的节点的权值改为1可以了,因为每一个节点只会修改一次,同样是输出区间乘积

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
ll m,mod,q;
struct tre{
ll l,r,val;
}tr[maxn<<2];
void push_up(ll da){
tr[da].val=(tr[da<<1].val%mod*tr[da<<1|1].val%mod);
}
void build(ll da,ll le,ll ri){
tr[da].l=le;
tr[da].r=ri;
if(le==ri){
tr[da].val=1;
return;
}
ll mids=(le+ri)>>1;
build(da<<1,le,mids);
build(da<<1|1,mids+1,ri);
push_up(da);
}
void gai(ll da,ll bh,ll w){
if(tr[da].l==tr[da].r){
tr[da].val=w%mod;
return;
}
ll mids=(tr[da].l+tr[da].r)>>1;
if(bh<=mids) gai(da<<1,bh,w);
else gai(da<<1|1,bh,w);
push_up(da);
}
void gai2(ll da,ll bh,ll w){
if(tr[da].l==tr[da].r){
tr[da].val=tr[da].val%mod*w%mod;
return;
}
ll mids=(tr[da].l+tr[da].r)>>1;
if(bh<=mids) gai(da<<1,bh,w);
else gai(da<<1|1,bh,w);
push_up(da);
}
ll qh(ll da,ll le,ll ri){
if(le<=tr[da].l && ri>=tr[da].r){
return tr[da].val%mod;
}
ll ans=1;
ll mids=(tr[da].l+tr[da].r)>>1;
if(le<=mids) ans=ans*qh(da<<1,le,ri)%mod;
if(ri>mids) ans=ans*qh(da<<1|1,le,ri)%mod;
return ans%mod;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld",&q,&mod);
build(1,1,q);
for(ll i=1;i<=q;i++){
ll t;
scanf("%lld%lld",&t,&m);
if(t==1){
gai2(1,i,m);
printf("%lld\n",qh(1,1,i)%mod);
} else {
gai(1,m,1);
printf("%lld\n",qh(1,1,i)%mod);
}
}
}
return 0;
}

数学计算 LibreOJ - 2573的更多相关文章

  1. 理工科应该的知道的C/C++数学计算库(转)

    理工科应该的知道的C/C++数学计算库(转) 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分析...这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件 ...

  2. Shell之数学计算

    本博客已经迁往http://www.kemaswill.com/, 博客园这边也会继续更新, 欢迎关注~ 数学计算是Shell中比较常用的一种操作,  但是因为shell中所有的变量都默认为字符串, ...

  3. Shell脚本笔记(三)shell中的数学计算

    shell中的数学计算 一.使用方括号 #!/bin/bash a= b= c= res=$[$a * ($c-$b)] echo $res 二.使用(()) +)) ((i=+)) b=$((-*) ...

  4. C语言中几个常用数学计算函数ceil(), floor(), round()的用法

    最近在实现算法的过程中,遇到了使用几个数学计算函数,感觉挺有意思,就记下来 方便以后使用. ceil(x)返回不小于x的最小整数值(然后转换为double型). floor(x)返回不大于x的最大整数 ...

  5. BZOJ 5334--[Tjoi2018]数学计算(线段树)

    5334: [Tjoi2018]数学计算 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 220  Solved: 147[Submit][Status ...

  6. 【BZOJ5334】数学计算(线段树)

    [BZOJ5334]数学计算(线段树) 题面 BZOJ 洛谷 题解 简单的线段树模板题??? 咕咕咕. #include<iostream> #include<cstdio> ...

  7. [LeetCode] 数学计算模拟类问题:加法,除法和幂,注意越界问题。题 剑指Offer,Pow(x, n) ,Divide Two Integers

    引言 数学计算的模拟类题目,往往是要求实现某种计算(比如两数相除),实现的过程中会有所限定,比如不允许乘法等等. 这类题目首先要注意计算过程中本身的特殊情况.比如求相除,则必须首先反映过来除数不能为0 ...

  8. Math类的数学计算功能

    //Math类的数学计算功能 public class MathTest { public static void main(String[] args) { /*----------下面是三角运算- ...

  9. bzoj 5334 数学计算

    bzoj 5334 数学计算 开始想直接模拟过程做,但模数 \(M\) 不一定为质数,若没有逆元就 \(fAKe\) 掉了. 注意到操作 \(2\) 是删除对应的操作 \(1\) ,相当于只有 \(1 ...

随机推荐

  1. vue+js清除定时器

    注意data数据里面一定要定义Timeout Timeout:Function,//定时器 methods里面 moseovefalse(){//需要执行的方法 var that=this; that ...

  2. 什么!你想要封装好的ajax

    ajax作为前端开发领域一个必不可少的内容,也是灵魂所在,今天就ajax的封装给大家做一个分析, 如果没有猜错的话现在基本上用原生去写ajax的意见不多了,这是肯定的 ,为什么这么说,jq的ajax大 ...

  3. python3 修改计算机名称GUI程序

    from tkinter import *from tkinter import messageboximport tkinterimport winregimport osdef serch(): ...

  4. python2.7 函数的参数学习

    1.默认参数 默认参数可以简化函数的调用. 设置默认参数时,有几点要注意: 一.必选参数在前,默认参数在后,否则Python的解释器会报错. 二.当函数有多个参数时,把变化大的参数放前面,变化小的参数 ...

  5. flex弹性模型

    flex模型是w3c最新提出的一种盒子模型,很好的解决了普通模型的一些弊端. 一.比较两种盒子模型: demo: 给div添加边框,观察他们的区别 <body> <div class ...

  6. MSCHART控件中长字符的X轴坐标标注全部显示

    X轴坐标如果超过9位的话,就不能完全显示了,就会一个隔一个的显示,解决的办法: Chart1.ChartAreas[].AxisX.Interval = ; //设置X轴坐标的间隔为1 Chart1. ...

  7. LR脚本信息函数-lr_get_master_host_name

    lr_get_master_host_name() 返回Controller主机的名称. char * lr_get_master_host_name(); lr_get_master_host_na ...

  8. android中获取其他应用的SharedPreferences

    在android中获取其他应用的SharedPreferences,需要其他应用设置的Mode为MODE_WORLD_READABLE或者MODE_WORLD_WRITABLE两种模式.要获取其他应用 ...

  9. HTTP Request Smuggling 请求走私

    参考文章 浅析HTTP走私攻击 SeeBug-协议层的攻击--HTTP请求走私 HTTP 走私漏洞分析 简单介绍 攻击者通过构造特殊结构的请求,干扰网站服务器对请求的处理,从而实现攻击目标 前提知识 ...

  10. Netdiscover

    Netdiscover不仅支持主动arp检测,还支持被动的arp检测,即把网卡设置为混杂模式,收取所有局域网内的arp广播数据包,从而判断活着的ip. 主动发现命令格式:netdiscover  -i ...