(并不能)发现29393不是质数,而是等于7*13*17*19

于是可以用四个线段树分别维护模意义下,对x进行一个区间的操作后的值

最后再把这四个的答案用crt拼起来

也可以不crt,而是预处理0~29392的每个情况

为了降低复杂度,预处理模7/13/17/19的幂

注意询问时,要把询问对7/13/17/19先取模

复杂度$O((7+13+17+19)nlogn)$

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
const int maxn=5e4+; inline int rd(){
int x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Node{
int op,v;
}; int Pow[][][],ans[][][][]; inline void init_pow(int x){
for(int i=;i<x;i++){
Pow[x][i][]=;
for(int j=;j<x-;j++) Pow[x][i][j]=Pow[x][i][j-]*i%x;
}
} inline int fpow(int x,int y,int mod){
return Pow[mod][x%mod][y%(mod-)];
} inline int cal(int x,Node y,int mod){
if(y.op==) return (x+y.v)%mod;
else if(y.op==) return x*y.v%mod;
else return fpow(x,y.v,mod);
} struct SegT{
int trans[maxn<<][],mod; inline void update(int p){
int a=p<<,b=p<<|;
for(int i=;i<mod;i++){
trans[p][i]=trans[b][trans[a][i]];
}
}
inline void change(int p,int l,int r,int x,Node y){
if(l==r){
for(int i=;i<mod;i++) trans[p][i]=cal(i,y,mod);
}else{
int m=(l+r)>>;
if(x<=m) change(p<<,l,m,x,y);
else change(p<<|,m+,r,x,y);
update(p);
}
}
}tr[]; int N,M; inline Node getnode(){
char s[];Node x;
scanf("%s",s);
if(s[]=='+') x.op=;
else if(s[]=='*') x.op=;
else x.op=;
x.v=;
for(int k=,j=strlen(s);k<j;k++) x.v=x.v*+s[k]-'';
return x;
} inline int solve(int x){
int a[];
for(int i=;i<;i++) a[i]=tr[i].trans[][x%tr[i].mod];
return ans[a[]][a[]][a[]][a[]];
} int main(){
int i,j,k;
tr[].mod=,tr[].mod=,tr[].mod=,tr[].mod=;
init_pow(),init_pow(),init_pow(),init_pow();
for(i=;i<;i++){
ans[i%][i%][i%][i%]=i;
}
for(int T=rd(),t=;t<=T;t++){
for(i=;i<;i++){
for(j=;j<=*N;j++){
for(k=;k<tr[i].mod;k++)
tr[i].trans[j][k]=k;
}
}
printf("Case #%d:\n",t);
N=rd(),M=rd();
for(i=;i<=N;i++){
Node x=getnode();
for(j=;j<;j++) tr[j].change(,,N,i,x);
}
for(i=;i<=M;i++){
int a=rd();
if(a==){
printf("%d\n",solve(rd()));
}else{
int x=rd();Node y=getnode();
for(j=;j<;j++) tr[j].change(,,N,x,y);
}
}
}
return ;
}

hdu5238 calculator (线段树+crt)的更多相关文章

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

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

  2. BZOJ 1129 exgcd+CRT+线段树

    思路: 先copy一下百度百科 作为预备知识吧多重全排列定义:求r1个1,r2个2,…,rt个t的排列数,设r1+r2+…+rt=n,设此排列数称为多重全排列,表示为$P(n;r1,r2,…,rt)$ ...

  3. HDU 5475(2015 ICPC上海站网络赛)--- An easy problem(线段树点修改)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5475 Problem Description One day, a useless calculato ...

  4. hdu 5475 An easy problem(暴力 || 线段树区间单点更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...

  5. HDU 5475 An easy problem 线段树

    An easy problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  6. 【XSY2720】区间第k小 整体二分 可持久化线段树

    题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...

  7. 2018.10.18 NOIP训练 ZUA球困难综合征(线段树)

    传送门 考虑到模数等于7 * 13 * 17 * 19. 那么只需要维护四棵线段树求出每个数处理之后模7,13,17,197,13,17,197,13,17,19的值再用crtcrtcrt合并就行了. ...

  8. hdu 5475 (线段树)

    An easy problem Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  9. HDU5475(线段树)

    An easy problem Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

随机推荐

  1. 从 RAID 到 Hadoop Hdfs 『大数据存储的进化史』

    我们都知道现在大数据存储用的基本都是 Hadoop Hdfs ,但在 Hadoop 诞生之前,我们都是如何存储大量数据的呢?这次我们不聊技术架构什么的,而是从技术演化的角度来看看 Hadoop Hdf ...

  2. IIS 反向代理到 Apache、Tomcat

    将请求的网址重写重定向到其它网址.当80端口被占用无法同时使用两个Web服务的解决方案,使得IIS和Apache Tomcat 共存 环境 WindowServer 2008 IIS7 Apache ...

  3. 三机互ping(自己总结)

    主机与虚拟机互ping设置: 点击VMware下的[编辑]--[虚拟网络编辑器]设置如下:         屏幕剪辑的捕获时间: 2016/5/21 13:10         屏幕剪辑的捕获时间: ...

  4. RabbitMQ广播:direct模式

    一. 消息的广播需要exchange:exchange是一个转发器,其实把消息发给RabbitMQ里的exchange fanout: 所有bind到此exchange的queue都可以接收消息,广播 ...

  5. vue 对象提供的属性功能、通过axio请求数据(2)

    1 Vue对象提供的属性功能 1.1 过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 1.1.1 使用Vue.filter()进行全局定义(全局 ...

  6. 关于创建本地docker仓库

    从远程仓库中下载regitstry镜像文件,下载后运行命令即可:docker run -p 5000:5000 -d registry

  7. gulp配置(编译压缩转码自动刷新注释全)

    参考自:http://www.sheyilin.com/2016/02/gulp_introduce/ 在原先基础上增加了less编译 es6转码资源地图等,修改了一部分的热刷新. gulpfile. ...

  8. 【转】Vue.js中 watch 的高级用法

    假设有如下代码: <div> <p>FullName: {{fullName}}</p> <p>FirstName: <input type=&q ...

  9. Docker(1):CentOS7 安装Docker

    1.查看系统内核,docker要求系统的内核版本高于3.10 #  uname -r 2.升级yum包,确保最新 #   yum update 3.安装所需要依赖包 #   yum install - ...

  10. ubuntu系统下mysql重置密码和修改密码操作

    一.忘记密码后想重置密码 在介绍修改密码之前,先介绍一个文件/etc/mysql/debian.cnf.其主要内容如下图: 里面有一个debian-sys-maint用户,这个用户只有Debian或U ...