HDU 5238 Calculator 线段树 中国剩余定理

题意:

给一个计算器,有一系列计算步骤,只有加,乘,幂三种运算。
有一种查询操作:查询初始值为\(x\)的时候,最终运算结果模\(29393\)的值。
有一种修改操作:可以修改第\(p\)个运算的运算符和运算数。

分析:

分解一下,\(29393=7 \times 13 \times 17 \times 19\)
所以我们可以维护\(4\)棵线段树,区间维护的信息就是初始值为\(x\)经过这段区间最终得到的值。
然后就用中国剩余定理整合一下。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int maxn = 50000 + 10;
const int maxnode = maxn * 4;const int prime[] = { 7, 13, 17, 19 };int val[4][20][maxnode];
int n, m;
char op[maxn], tmp[5];
int x[maxn];int pow_mod(int a, int b, int mod) {int ans = 1;while(b) {if(b & 1) ans = ans * a % mod;a = a * a % mod;b >>= 1;}return ans;
}int calc(int a, char op, int b, int mod) {if(op == '+') return ((a + b) % mod);if(op == '*') return a * b % mod;return pow_mod(a, b, mod);
}void pushup(int o) {for(int i = 0; i < 4; i++)for(int j = 0; j < prime[i]; j++) {int t = val[i][j][o<<1];val[i][j][o] = val[i][t][o<<1|1];}
}void build(int o, int L, int R) {if(L == R) {for(int i = 0; i < 4; i++)for(int j = 0; j < prime[i]; j++)val[i][j][o] = calc(j, op[L], x[L], prime[i]);return;}int M = (L + R) / 2;build(o<<1, L, M);build(o<<1|1, M+1, R);pushup(o);
}void update(int o, int L, int R, int p) {if(L == R) {for(int i = 0; i < 4; i++)for(int j = 0; j < prime[i]; j++)val[i][j][o] = calc(j, op[p], x[p], prime[i]);return;}int M = (L + R) / 2;if(p <= M) update(o<<1, L, M, p);else update(o<<1|1, M+1, R, p);pushup(o);
}void gcd(int a, int b, int& d, int& x, int& y) {if(!b) { d = a; x = 1; y = 0; }else { gcd(b, a%b, d, y, x); y -= x*(a/b); }
}int a[4];
int CRT() {int M = 29393, d, y, x = 0;for(int i = 0; i < 4; i++) {int w = M / prime[i];gcd(prime[i], w, d, d, y);x = (x + y*w*a[i]) % M;}return (x+M)%M;
}int main()
{int T; scanf("%d", &T);for(int kase = 1; kase <= T; kase++) {printf("Case #%d:\n", kase);scanf("%d%d", &n, &m); getchar();for(int i = 1; i <= n; i++) {scanf("%c%d", op + i, x + i);getchar();}build(1, 1, n);while(m--) {int cmd, p;scanf("%d%d", &cmd, &p);if(cmd == 1) {for(int i = 0; i < 4; i++)a[i] = val[i][p%prime[i]][1];printf("%d\n", CRT());} else {getchar();scanf("%c%d", op + p, x + p);update(1, 1, n, p);}}}return 0;
}

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/5274337.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux shell之把文本里面的;替换成\n格式输出

1 问题 一个文本里面很多中间很多&#xff1b;然后&#xff0c;现在需要把&#xff1b;替换成\n,然后换行打印出来 比如文件1.txt namechenyu;sexman;age27 我们可以用tr命题替换&#xff0c;第一个参数是需要替换的内容&#xff0c;第二个参数是将要替换的内容 2 实现 ca…

利用Excel VBA批量计算气象数据多个台站多年来春季和冬季降水量和平均气温

气象数据是地理数据的重要组成部分,存储量虽然不大,但是处理过程非常繁琐,长时序数据更不用说。本文总结了一个气象数据的基本处理方法。 如下图所示,气象数据的排列格式是区站号→年→月→降水量→平均气温,时间范围为1983~2012年,每一年都有台站数300多个,下面按区站…

VMware Workstation 12新建虚拟机

1、点击“创建新的虚拟机”2、选择“自定义”(初学选择典型也可以)&#xff0c;下一步3、默认&#xff0c;直接下一步4、通常都是先创建虚拟机&#xff0c;等虚拟机创建完成后再来安装操作系统&#xff0c;若安装过程出现什么问题方便解决&#xff0c;故选择“稍后安装操作系统…

sql count用法_SQL学习笔记3:count(*)函数

1.count(*)函数用法COUNT(*) 函数返回表中的记录数&#xff0c;具体来说&#xff0c;返回值是一个数字。语法&#xff1a;返回表中所有记录的数量&#xff1a;SELECT COUNT(*) FROM table_name返回表中满足一定条件的记录的数量&#xff1a;SELECT COUNT(*) FROM table_name WH…

sql order by,desc和limit使用(mysql)

(&#xff61;ŏ_ŏ) 首先我们来看一个表&#xff1a; 在此我们要进行排序&#xff0c;按降序排序&#xff0c;就是从大到小。然后我们只要查询前2条数据。 意思就是我们需要把这个表从大到小排序后&#xff0c;取前两条&#xff0c;那么我们就需要使用到order by 和desc …

Blazor University (13)组件 — 多线程渲染

原文链接&#xff1a;https://blazor-university.com/components/multi-threaded-rendering/多线程渲染由于 Blazor Server 应用程序中可用的线程不止一个&#xff0c;因此完全有可能不同的组件可以让不同的线程在其上执行代码。这在基于异步任务的操作中最常见。例如&#xff…

【Util】 时间天数增加,时间比较。

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/inforstack/article/details/46516623 public static void main(String[] args) {try {DateFormat formatter new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Cale…

linux shell之$?和得到联合使用命令的结果

1 介绍 $?命令&#xff1a;可以得到上次执行命令的值&#xff0c;如果返回时0&#xff0c;说明执行成功&#xff0c;如果是其它数说明命令执行失败 联合使用命令&#xff1a;我们一般这样使用 value$(cat 1.txt | grep chenyu) echo $value 2 代码测试 #/bin/bashpwd"…

方法调用(车票练习)

第一步、创建一个类 //public class Tickete //{ //写一个Ticket类&#xff0c;有一个距离属性&#xff08;本属性只读&#xff0c;在构造方法中赋值&#xff09; //不能为负数&#xff0c;有一个价格属性&#xff0c;价格属性只读&#xff0c; //并且根据距离distance计算价格…

sql 之like 和通配符%,_(mysql)

(&#xff61;ŏ_ŏ) like模糊查询&#xff0c;啥叫模糊查询&#xff1f; 例如&#xff1a;我们一个数据库里面存在在一个人叫做李二三四。我们忘记了他的名字&#xff0c;只记得他的姓名&#xff0c;那么我们就可以使用like加上通配符来查询出我们所要的结果&#xff1b;话说…

php邮件代码c语言,C语言实现邮件发送功能(SMTP)源码

【实例简介】C 语言编写的邮件发送器是SMTP协议的源代码和EXE执行程序均在里面使用VS2013开发环境生成&#xff0c;填写对应参数即可成功进行邮件发送&#xff0c;不用配置邮件服务器&#xff0c;只需一个支持SMTP协议的邮箱账号密码即可【实例截图】【核心代码】#include #inc…

【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors

d(x)表示x的约数个数&#xff0c;让你求&#xff08;l,r<10^12,r-l<10^6,k<10^7&#xff09; #include<cstdio> using namespace std; #define MOD 998244353ll #define MAXP 1000100 typedef long long ll; ll x,y; int T,K; bool isNotPrime[MAXP10]; int num…

python本地库_Python学习第71课-本地建立repository仓库

【每天几分钟&#xff0c;从零入门python编程的世界&#xff01;】我们在本地建立一个repository(仓库)&#xff0c;这个repository(仓库)就是用来对我们的文件版本进行跟踪的。repository(仓库)就是通过git命令中的init命令创建的&#xff0c;想要在shell中让git命令生效&…

C#/.Net 不要再使用Aspose和iTextSharp啦!QuestPDF操作生成PDF更快更高效!

QuestPDFQuestPDF是一个开源的工具库&#xff0c;可以在.NET或者.Net Core中生成pdf文档它提供了一个布局引擎&#xff0c;设计时考虑到了完整的分页支持以及灵活性要求&#xff01;比市面上常见的Aspose和iTextSharp好用太多了&#xff01;GitHub地址安装Install-Package Ques…

C#创建桌面快捷方式

1、添加引用Windows Script Host Object Model,并引用命名空间using IWshRuntimeLibrary; 2、代码 using System; using IWshRuntimeLibrary; using System.Windows.Forms;namespace WindowsFormsApplication1 {public partial class Form1 : Form{public Form1(){InitializeC…

linux shell之IFS分割字符串

1 问题 我们有段字符串data"chenyu:chenzixuan:chenzi",我们需要通过&#xff1a;分割&#xff0c;我们可以采用IFS 我们可以采用下面的模板 oldIFS$IFSIFS":"for item in $data; do******* doneIFS$oldIFS2 代码实现 #/bin/bashdata"chenyu, che…

Java报表工具FineReport导出EXCEL的四种API

在实际的应用中会经常需要将数据导出成excel&#xff0c;导出的方式除原样导出还有分页导出、分页分sheet导出和大数据量导出。对于excel 2003版&#xff0c;由于限制了每个sheet的最大行数和列数&#xff0c;大数据量导出时会默认时分多个sheet&#xff0c;而excel2007不会出现…

sql in 用法(mysql)

我们先看一个如下数据库表&#xff1a; 我们如果想查询这张表里面age为11和1的人该怎么办呢&#xff1f; 那么我们的 in 操作符就起作用了&#xff1a; SELECT * FROM table1 WHERE age1 IN(11,1); 查询来自表哥table1的数据&#xff0c;条件为age1 在(11,1)这两个数之中…

matlab的循环语句裁图,[MATLAB图像处理] 多幅图片处理的循环语句

多幅图片处理的循环语句 小弟毕业设计关于视频去雾处理&#xff0c;将视频截取为图片后对每张图片进行处理&#xff0c;其中需要用到循环语句来减少工作量&#xff0c;但自己对循环语句不怎么会&#xff0c;希望哪位大大能够给予帮助&#xff0c;谢谢了程序如下block_size 15;…