题意:

有加,乘,次方3种运算,初始值为x,给定运算式。
现在有2种操作:
第一种:告诉你x的值,求答案模29393。
第二种:更改某个位置的运算。

解析:

线段树维护值域的问题,但是那个操作并不能简单的合并,因为值域还是很大的数组开不下,所以我们得另寻他法。
可以发觉29393并不是质数,29393 = 7×13×17×19。

设:
t1=ans%7t1 = ans\%7,t2=ans%13t2=ans\%13,t3=ans%17t3=ans\%17,t4=ans%19t4=ans\%19

那么问题的解就是模方程组

⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪x≡t1(mod)7x≡t2(mod)13x≡t3(mod)17x≡t4(mod)19

\left\{ \begin{aligned} x≡t1(mod)7 \\ x≡t2(mod)13 \\ x≡t3(mod)17\\x≡t4(mod)19 \end{aligned} \right.

所以我们对其中因子做线段树,线段树只需维护对于每个小于质因子的数经过这个区间答案是几即可,最后利用中国剩余定理对答案进行合并。

mymy codecode

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ls (o<<1)
#define rs (o<<1|1)
using namespace std;const int MAXN = 50005;
const int MOD = 29393;
int factor[] = {7, 13, 17, 19};//modpow
//------------------------------------------
int modpow(int a, int k, int p) {int c = 1;while(k) {if(k & 1) c = (c*a) % p;a = (a*a)%p;k >>= 1;}return c;
}//segment tree
//------------------------------------------
struct Oper {char ch; int val;inline void read() {char cmd[10];scanf("%s", cmd);ch = cmd[0];sscanf(cmd+1, "%d", &val);}inline int cal(int x, int p) {int ret = 0;switch(ch) {case '+': ret = (x + val) % p;break;case '*': ret = (x * val) % p;break;case '^': ret = modpow(x, val, p);break;}return ret;}
} op[MAXN];int pos; //修改的位置
struct Tree {int mod;int value[MAXN<<2][20];inline void pushUp(int o) { //左边维护的值,传到右边维护for(int i = 0; i < mod; i++) {value[o][i] = value[rs][value[ls][i]];}}void build(int o, int L, int R) {if(L == R) {for(int i = 0; i < mod; i++)value[o][i] = op[L].cal(i, mod);return ;}int M = (L+R)/2;build(ls, L, M);build(rs, M+1, R);pushUp(o);}void modify(int o, int L, int R) {if(L == R) {for(int i = 0; i < mod; i++)value[o][i] = op[L].cal(i, mod);return ;}int M = (L+R)/2;if(pos <= M) modify(ls, L, M);else modify(rs, M+1, R);pushUp(o);}
} tree[4];
//------------------------------------------//mod rule
//------------------------------------------
int exgcd (int a, int b, int &x, int &y) {if ( !b ) {x = 1, y = 0;return a;}int ans = exgcd ( b , a % b , y , x );y -= a / b * x;return ans;
}int calc(int val) {int ans = 0;for (int i = 0 ; i < 4 ; i++) {int tmp = MOD / factor[i] , x , y;exgcd(tmp , factor[i] , x , y);ans = (ans + tree[i].value[1][val % factor[i]] * tmp * (x % factor[i]) ) % MOD ;}return (ans+MOD) % MOD;
}
//------------------------------------------int n, m;
int main() {//freopen("in.txt", "r", stdin);int T, cas = 1;scanf("%d", &T);while(T--) {printf("Case #%d:\n", cas++);scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++)op[i].read();for(int i = 0; i < 4; i++) {tree[i].mod = factor[i];tree[i].build(1, 1, n);}int choice, x;while(m--) {scanf("%d", &choice);if(choice == 1) {scanf("%d", &x);printf("%d\n", calc(x));        }else {scanf("%d", &pos);op[pos].read();for(int i = 0; i < 4; i++)tree[i].modify(1, 1, n);}}}return 0;
}

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

  1. 【HDU】5238 Calculator 【中国剩余定理+线段树】

    传送门:[HDU]5238 Calculator 题目分析: 模数可以拆成四个小素数:7,13,17,19. 这样我们可以分别对这几个素数跑答案,最后中国剩余定理搞一下就好.中间我们用线段树,保存每个 ...

  2. hdu5238(中国剩余定理+线段树)

    hdu5238 题目链接 题意是对于一个数字x,进行一次有n个运算操作的的运算,如*5 +6 ^3,就是对x先*5再+6 再3次幂,然后输出最后的结果对29393取模的答案. 然后接下来有m次操作,有 ...

  3. HDU 1166 敌兵布阵(线段树:点更新,区间求和)

    HDU 1166 敌兵布阵(线段树:点更新,区间求和) http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意: 给你n个整数,然后给你多条命令,每条命令如 ...

  4. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  5. 2019CCPC网络赛 1002 HDU 6703(权值线段树)

    2019CCPC网络赛 1002 HDU 6703(权值线段树) 思路:用权值线段树存题目给的数据后,2操作就是求权值线段树中大于等于k的部分中,靠近左端点的第一个大于r的值(这个求出来的只是原序列中 ...

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

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

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

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

  8. HDU 5238 Calculator【线段树】

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

  9. hdu 5238 Calculator

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

最新文章

  1. Transformer 眼中世界 Vs. CNN 眼中世界
  2. python使用np.argsort对一维numpy概率值数据排序获取升序索引、获取的top索引(例如top2、top5、top10)索引二维numpy数组中对应的原始数据:原始数据概率最小的头部数据
  3. HEALTHY LIFE OPENCART 自适应主题模板 ABC-0133
  4. mysql command type_mysql command line client 使用命令
  5. Docker学习笔记_网上资源参考
  6. IBM公布Kitura 1.0和Bluemix Runtime for Swift 3
  7. 7-200 天梯赛的善良 (20 分)
  8. yii2 关系...
  9. 安装Aanconda详细教程
  10. Android Studio 0.1 gradle home的问题
  11. 深度操作系统 V15.11发布——心随意动 畅享云端
  12. python tkinter frame教程_Tkinter教程之Frame 框架
  13. 农业银行联行号怎么查询_中国农业银行大额联行号12位是什么,怎么查找
  14. 解读2022城市大脑首批三项标准
  15. 蓝牙技术谈之跳频技术(一)
  16. 由马斯克的Space X 火箭的主芯片程序编写语言说起
  17. 【Unity3D】AR游戏制作 - Sikuto's Farm
  18. 金庸群侠X版 会议纪要
  19. 探索AI实践最优解,AISummit全球人工智能技术大会完美落幕
  20. Python——爬虫抓取图片

热门文章

  1. maya镜像模型但不改变点序 对称操作
  2. Codeforces 645B Mischievous Mess Makers【逆序数】
  3. 《宣州谢眺楼饯别校书叔云》赏析
  4. 聪明好学的王强用计算机设计了,五年级语文下册期中试卷-(1)(1).doc
  5. python 安装 pyinstaller 报错Preparing wheel metadata ... error
  6. 个人提交专利,对说明书内容会进行查重吗
  7. python 将多个文件合并成一个文件
  8. 爱普生Epson WorkForce WF-7725 一体机驱动
  9. 惠普linux系统改装win7,惠普EliteDesk800 G3台式机预装win10改win7教程
  10. 1.[QT | QCharts | 动态显示]折线图标题字体大小无法更改