数学计算 LibreOJ - 2573
题目描述
小豆现在有一个数 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的更多相关文章
- 理工科应该的知道的C/C++数学计算库(转)
理工科应该的知道的C/C++数学计算库(转) 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分析...这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件 ...
- Shell之数学计算
本博客已经迁往http://www.kemaswill.com/, 博客园这边也会继续更新, 欢迎关注~ 数学计算是Shell中比较常用的一种操作, 但是因为shell中所有的变量都默认为字符串, ...
- Shell脚本笔记(三)shell中的数学计算
shell中的数学计算 一.使用方括号 #!/bin/bash a= b= c= res=$[$a * ($c-$b)] echo $res 二.使用(()) +)) ((i=+)) b=$((-*) ...
- C语言中几个常用数学计算函数ceil(), floor(), round()的用法
最近在实现算法的过程中,遇到了使用几个数学计算函数,感觉挺有意思,就记下来 方便以后使用. ceil(x)返回不小于x的最小整数值(然后转换为double型). floor(x)返回不大于x的最大整数 ...
- BZOJ 5334--[Tjoi2018]数学计算(线段树)
5334: [Tjoi2018]数学计算 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 220 Solved: 147[Submit][Status ...
- 【BZOJ5334】数学计算(线段树)
[BZOJ5334]数学计算(线段树) 题面 BZOJ 洛谷 题解 简单的线段树模板题??? 咕咕咕. #include<iostream> #include<cstdio> ...
- [LeetCode] 数学计算模拟类问题:加法,除法和幂,注意越界问题。题 剑指Offer,Pow(x, n) ,Divide Two Integers
引言 数学计算的模拟类题目,往往是要求实现某种计算(比如两数相除),实现的过程中会有所限定,比如不允许乘法等等. 这类题目首先要注意计算过程中本身的特殊情况.比如求相除,则必须首先反映过来除数不能为0 ...
- Math类的数学计算功能
//Math类的数学计算功能 public class MathTest { public static void main(String[] args) { /*----------下面是三角运算- ...
- bzoj 5334 数学计算
bzoj 5334 数学计算 开始想直接模拟过程做,但模数 \(M\) 不一定为质数,若没有逆元就 \(fAKe\) 掉了. 注意到操作 \(2\) 是删除对应的操作 \(1\) ,相当于只有 \(1 ...
随机推荐
- Dubbo+Zookeeper集群案例
一.开源分布式服务框架 1.Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以Spring框架无缝集成. Dubbo是一款高性 ...
- SpringCloud之Security
Spring Security是Spring提供的一个安全框架,提供认证和授权功能,最主要的是它提供了简单的使用方式,同时又有很高的灵活性,简单,灵活,强大. 我个人博客系统采用的权限框架就是Spri ...
- Thread基础-创建线程的方式
Java线程创建的几种简单方式 1. extends Thread类 public class ThreadDemo extends Thread{ @Override public void run ...
- api请求允许跨域的问题
让api请求允许跨域 header("Access-Control-Allow-Origin:*");header('Access-Control-Allow-Credential ...
- Docker巨轮的航行之路-基础知识篇
一.什么是Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中 ...
- CentOS7.5搭建ES6.2.4集群与简单测试
一 简介 Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎.它允许您快速,近实时地存储,搜索和分析大量数据.它通常用作支持具有复杂搜索功能和需求的应用程序的底层引擎/技术. 下载地址 ...
- 网站用https访问的问题
网站挂到阿里云上, 可以http访问, 也可以https访问. 但是如果用https方式访问网站.发现接口报错. 因为接口只提供http方式. 在谷歌浏览器出现: Mixed Content: The ...
- 006.OpenShift持久性存储
一 持久存储 1.1 持久存储概述 默认情况下,运行容器使用容器内的临时存储.Pods由一个或多个容器组成,这些容器一起部署,共享相同的存储和其他资源,可以在任何时候创建.启动.停止或销毁.使用临时存 ...
- 天津开发票/v电13543443967
关于事项:Iㄋ5一★4З44一★ㄋ9.б7开发票的准备资料必须要公司名称个人的话就用个人名字和身份证去税务柜台申请办理!公司的话要提供公司全称就是营业执照上的名称,纳税人税号,如果是开普通增值税发票的 ...
- 「从零单排canal 03」 canal源码分析大纲
在前面两篇中,我们从基本概念理解了canal是一个什么项目,能应用于什么场景,然后通过一个demo体验,有了基本的体感和认识. 从这一篇开始,我们将从源码入手,深入学习canal的实现方式.了解can ...