题意:

给一个计算器,有一系列计算步骤,只有加,乘,幂三种运算。
有一种查询操作:查询初始值为\(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

HDU 5238 Calculator 线段树 中国剩余定理相关推荐

  1. hdu 5238 Calculator(线段树+中国剩余定理)

    非常巧的一个题. 运算过多,肯定得用数据结构维护一些东西,这里要维护的是映射关系,运算的本质其实就是函数,也就是映射. 但是答案对29393取模,对0-29393的数维护映射在空间上和时间上都是撑不住 ...

  2. HDU-5238 Calculator(线段树+中国剩余定理)

    题意 给定一个关于 xxx 的表达式,形如下例: x×4+2^3+8×6" role="presentation" style="position: relat ...

  3. HDU 2795 Billboard (线段树+贪心)

    HDU 2795 Billboard (线段树+贪心) 手动博客搬家:本文发表于20170822 21:30:17, 原地址https://blog.csdn.net/suncongbo/articl ...

  4. HDU 5238 Calculator(中国剩余定理+线段树)

    题意: 有加,乘,次方3种运算,初始值为x,给定运算式. 现在有2种操作: 第一种:告诉你x的值,求答案模29393. 第二种:更改某个位置的运算. 解析: 线段树维护值域的问题,但是那个操作并不能简 ...

  5. hdu 5238 Calculator(线段树+CRT)

    题意:有加,乘,次方3种运算,初始值为x,给定运算式,2种操作,第一种:告诉你x的值,求答案模29393.第二种:更改某个位置的运算. 做法:乍一看就像线段树,但是那个操作并不能简单的合并,所以我们得 ...

  6. HDU 5238 Calculator【线段树】

    其实这题真是不好想啊 首先,我们观察到29393不是一个质数,通过质分解我们得到 29393=7∗13∗17∗19 29393=7*13*17*19于是就可以想到中国剩余定理,将数给分解了再求模方程. ...

  7. hdu 5238 Calculator

    某线段树 打模拟赛的时候不知道区间该维护什么东西使其变得可合并,然后就放着了 赛后看了题解才知道这个题维护的是映射关系,感觉也是十分的厉害 考虑一个算式a+4(mod7)=ba + 4 \pmod{7 ...

  8. HDU 5861 Road 线段树区间更新单点查询

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...

  9. hdu 3308 LCIS 线段树 + 区间合并

    传送门 文章目录 题意: 思路: 题意: 思路: 日常水一篇题解. 带修改的求区间连续的递增序列,我们考虑用线段树维护. 直接维护mlenmlenmlen是区间最长的递增序列,lslsls是从左端点开 ...

最新文章

  1. 一图分析华为最新AI生态与未来趋势
  2. 3个可以写进简历的京东AI NLP项目实战,走完这五步就是Top算法工程师
  3. Stella Forum v2 线上版开发总结
  4. 源码包部署tomcat
  5. java hashtable排序_java中哈希表中有迭代器模式的实现,可以认为其是顺序表吗?...
  6. PyQt5 技巧篇-便于文字排版的等宽字体推荐:Source Code Pro的中文为英文两倍宽字体
  7. Jdbc模版式写法与Spring-JdbcTemplate的比较
  8. 零XML的Spring配置
  9. 【渝粤教育】 国家开放大学2020年春季 1443卫生信息与文献检索 参考试题
  10. Android 系统性能优化(21)---App启动原理分析及启动时间优化
  11. listen函数的第二个参数_signal(SIGPIPE,?SIG_IGN)listen函数中backlog参数分析
  12. 折腾BIOS,改开机logo图标
  13. 切比雪夫多项式c语言csdn,切比雪夫多项式(Chebyshev polynomials)
  14. 基于multisim的zcs电路仿真
  15. 这应该是史上最强的物理学科普(雄文)
  16. 超小白教程之快速排序
  17. 逻辑思维题总结与例题分析
  18. 离婚协议中的几个重点
  19. Codeforces 32C.Flea
  20. python双手打字_Python打字练习小游戏源代码

热门文章

  1. python变量名可以包含的字符有问号吗,带问号文字的Python正则表达式
  2. 电脑维修:电脑维修必备工具整理
  3. 程序员最讨厌的100件事,瞬间笑喷了,哈哈~~
  4. 搞清这些陷阱,NULL和三值逻辑再也不会作妖
  5. MYSQL统计和识别重复值
  6. an导入html5,H5-FLASH:AN HTML5-BASED FLASH RUNTIME
  7. 二进制编译安装mysql_数据库(MySQL)二进制安装+编译安装 + MariaDB编译安装
  8. pyqt5子窗口跳出主窗口_弹出式窗口与 可用性,转换和跳出率
  9. unity 全息交互ui_UI向3D投影全息界面的连续发展
  10. 60+ 实用 React 工具库,助力你高效开发!