(并不能)发现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. Anaconda安装

    Anaconda安装时,不用单独安装python,直接安装anaconda里面就包含有对应版本的python以及各种python包,比如常用的pandas.matplotlib.numpy等.(作为一 ...

  2. C#判断远程计算机的指定端口是否打开的代码

    如下的内容段是关于C#判断远程计算机的指定端口是否打开的内容,应该能对小伙伴有一些用. using System.Net;if(!string.IsNullOrEmpty(txtPort.Text)) ...

  3. 使用superlance插件增强supervisor的监控能力

    supervisor与superlance简介 supervisor是一款用python编写的进程监控.进程守护和进程管理的工具,可以工作在各种UNIX-like的操作系统上,通过简单的配置就可以启动 ...

  4. Google Chrome等浏览器不允许关闭点击跟踪??

    hrome.Safari.Opera 和 Microsoft Edge 的新版本将不再允许用户关闭“链接审计( hyperlink auditing)”的功能.链接审计是一项 HTML 标准,被用于跟 ...

  5. Java面试准备之JVM

    介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明 程序计数器:看做当前线程所执行的字节码行号指示器.是线程私有的内存,且唯一一块不报OutOfMemoryError异常. Java虚拟 ...

  6. c# winform 多屏显示

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  7. 如何用ABP框架快速完成项目(6) - 用ABP一个人快速完成项目(2) - 使用多个成熟控件框架

    正如我在<office365的开发者训练营,免费,在微软广州举办>课程里面所讲的, 站在巨人的肩膀上的其中一项就是, 尽量使用别人成熟的框架. 其中也包括了控件框架   abp和52abp ...

  8. 服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)

    [前言] Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butt ...

  9. windows下redis安装及配置

    1.简介: redis是一个高性能的key-value数据库:redis能读的速度为11万次/秒,写的速度是8.1万次/秒 redis支持丰富的数据类型:String, List, Hash(map) ...

  10. 静态类(C#)

    基本简介: 类可以声明为 static 的,以指示它仅包含静态成员.不能使用 new 关键字创建静态类的实例.静态类在加载包含该类的程序或命名空间时由 .NET Framework 公共语言运行库 ( ...