传送门:【HDU】5238 Calculator

题目分析:

模数可以拆成四个小素数:7,13,17,19。
这样我们可以分别对这几个素数跑答案,最后中国剩余定理搞一下就好。中间我们用线段树,保存每个模数下,一个数通过一个区间内的操作转化成的另一个数是多少,并且这个满足合并,然后就做完了。

PS:听叉姐他们说才知道……完全可以不用中国剩余定理,直接暴力打一个4维数组存下来就可以了……

my  code:my~~code:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std ;typedef long long LL ;#define clr( a , x ) memset ( a , x , sizeof a )
#define ls ( o << 1 )
#define rs ( o << 1 | 1 )
#define lson ls , l , m
#define rson rs , m + 1 , r
#define mid ( ( l + r ) >> 1 )
#define root 1 , 1 , nconst int MAXN = 50005 ;
const int MOD = 29393 ;int mod[4] = { 7 , 13 , 17 , 19 } ;
int p[4][20][MOD] ;
int f[MAXN << 2][4][20] ;
int n , m ;void preprocess () {for ( int i = 0 ; i < 4 ; ++ i ) {for ( int j = 0 , m = mod[i] ; j < m ; ++ j ) {p[i][j][0] = 1 ;for ( int k = 1 ; k < MOD ; ++ k ) {p[i][j][k] = p[i][j][k - 1] * j % m ;}}}
}void upd ( int o , char op , int x ) {for ( int i = 0 ; i < 4 ; ++ i ) {for ( int j = 0 , m = mod[i] ; j < m ; ++ j ) {if ( op == '+' ) f[o][i][j] = ( j + x ) % m ;else if ( op == '*' ) f[o][i][j] = ( j * x ) % m ;else f[o][i][j] = p[i][j][x] ;}}
}void push_up ( int o ) {for ( int i = 0 ; i < 4 ; ++ i ) {for ( int j = 0 , m = mod[i] ; j < m ; ++ j ) {f[o][i][j] = f[rs][i][f[ls][i][j]] ;}}
}void build ( int o , int l , int r ) {if ( l == r ) {char c ;int x ;scanf ( " %c%d" , &c , &x ) ;upd ( o , c , x ) ;return ;}int m = mid ;build ( lson ) ;build ( rson ) ;push_up ( o ) ;
}void update ( int x , char c , int v , int o , int l , int r ) {if ( l == r ) {upd ( o , c , v ) ;return ;}int m = mid ;if ( x <= m ) update ( x , c , v , lson ) ;else update ( x , c , v , rson ) ;push_up ( o ) ;
}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 crt ( int v ) {int ans = 0 ;for ( int i = 0 ; i < 4 ; ++ i ) {int t = MOD / mod[i] , x , y ;exgcd ( t , mod[i] , x , y ) ;ans = ( ans + f[1][i][v % mod[i]] * t * ( x % mod[i] ) ) % MOD ;}return ( ans + MOD ) % MOD ;
}void solve () {int op , x , v ;char c ;scanf ( "%d%d" , &n , &m ) ;build ( root ) ;while ( m -- ) {scanf ( "%d%d" , &op , &x ) ;if ( op == 1 ) {printf ( "%d\n" , crt ( x ) ) ;} else {scanf ( " %c%d" , &c , &v ) ;update ( x , c , v , root ) ;}}
}int main () {int T ;preprocess () ;scanf ( "%d" , &T ) ;for ( int i = 1 ; i <= T ; ++ i ) {printf ( "Case #%d:\n" , i ) ;solve () ;}return 0 ;
}

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

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

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

  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. 机器学习(MACHINE LEARNING)种群竞争模型
  2. 使用Azure SDK 1.4.1中的Web Deploy
  3. SFP模块光信号强度知识介绍
  4. Android中AVD(Android Virtual Device)不能启动的处理方法
  5. Hook的两个小插曲
  6. RHEL 8 - 安装 webconsole
  7. 海缆修好之前,上网悠着点
  8. unity3d用鼠标拖动物体的一段代码
  9. Web文件管理原码.rar
  10. 【Java】菜鸟教程个人Java学习笔记
  11. SpringBoot系列之(二):2.注解
  12. 腾讯地图实时精准定位
  13. pstack 安装linux_linux下的进程堆栈查看工具pstack
  14. 简单的下拉列表的二级联动、省市
  15. PHP开发人员的8个分布式计算谬论
  16. c语言转换为stc程序,STC51单片机入门(C语言)
  17. Knowledge Graph表示学习--TransE系列
  18. PS案例提升 【第1节】抠图--薄、透、露的朦胧美 案例1:扣透明的冰块
  19. 【数据结构】二叉树顺序结构及实现
  20. iso快门光圈_相机最重要的设置:快门速度,光圈和ISO解释

热门文章

  1. 比较火的NFT数字艺术品交易平台
  2. 微信公众平台开发基础
  3. 改进YOLOv5系列:10.最新HorNet结合YOLO应用首发! | 多种搭配,即插即用 | Backbone主干、递归门控卷积的高效高阶空间交互高效
  4. 不小心删除了网络适配器中的无线网卡驱动?
  5. 如何低成本搭建dnslog服务器
  6. Processing 网格纹理制作(棋盘格)
  7. Whitelabel Error Page 的原因
  8. 给自己的android扫盲文 - 1
  9. 超实用的Mac快捷键神器:CheatSheet Mac中文免费版
  10. IDEA SpringBoot 自定义Banner