hdu5238 calculator (线段树+crt)
(并不能)发现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)的更多相关文章
- HDU 5238 Calculator 线段树 中国剩余定理
题意: 给一个计算器,有一系列计算步骤,只有加,乘,幂三种运算. 有一种查询操作:查询初始值为\(x\)的时候,最终运算结果模\(29393\)的值. 有一种修改操作:可以修改第\(p\)个运算的运算 ...
- BZOJ 1129 exgcd+CRT+线段树
思路: 先copy一下百度百科 作为预备知识吧多重全排列定义:求r1个1,r2个2,…,rt个t的排列数,设r1+r2+…+rt=n,设此排列数称为多重全排列,表示为$P(n;r1,r2,…,rt)$ ...
- HDU 5475(2015 ICPC上海站网络赛)--- An easy problem(线段树点修改)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5475 Problem Description One day, a useless calculato ...
- hdu 5475 An easy problem(暴力 || 线段树区间单点更新)
http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...
- HDU 5475 An easy problem 线段树
An easy problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- 【XSY2720】区间第k小 整体二分 可持久化线段树
题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...
- 2018.10.18 NOIP训练 ZUA球困难综合征(线段树)
传送门 考虑到模数等于7 * 13 * 17 * 19. 那么只需要维护四棵线段树求出每个数处理之后模7,13,17,197,13,17,197,13,17,19的值再用crtcrtcrt合并就行了. ...
- hdu 5475 (线段树)
An easy problem Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- HDU5475(线段树)
An easy problem Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
随机推荐
- rxjava切换线程避免重复代码
.subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThrea ...
- JavaScript(二)数据类型(一)
计算机程序的运行需要对值进行操作,在编程语言中值的类型被称作数据类型,编程语言最基本的特性就是能够支持多种数据类型.当程序需要将值保存起来以备将来使用时,便将其赋值给一个变量.变量是一个值的符号名称, ...
- c/c++ 多线程 mutex的理解
多线程 mutex的理解 mutex,我的理解是每个mutex对象都是一个带锁头的门,这个门有两个状态,门开着和门关着,感觉像是废话... 当想查看门的里东西,或者把东西放进门里,或者从门里拿出东西前 ...
- iOS开发之Swift 4 JSON 解析指南
Apple 终于在 Swift 4 的 Foundation 的模块中添加了对 JSON 解析的原生支持. 虽然已经有很多第三方类库实现了 JSON 解析,但是能够看到这样一个功能强大.易于使用的官方 ...
- FPGA驱动VGA显示静态图片
一 .前言 本文设计思想采用明德扬至简设计法.VGA是最常见的视频显示接口,时序也较为简单.本文从利用显示屏通过VGA方式显示测试图案及静态图片着手带大家接触图像显示应用,算是为后续VGA显示摄像头采 ...
- 修改文件属性(attrib)
atrrib 命令: // 描述: (Attribute) 显示,设置或删除分配给文件或目录的属性. 如果在没有参数的情况下使用,attrib将显示当前目录中所有文件的属性. // 语法: attri ...
- java 项目打jar包,用cmd运行,并且编写运行脚本
项目是ideal编辑器的springboot项目的demo.打包就是在侧边栏,点击packge ,就会在target下生成jar包. 生成之后把 jar包放在一个文件夹中.新建一个txt文件,在txt ...
- 【转】Android 增,删,改,查 通讯录中的联系人
一.权限 操作通讯录必须在AndroidManifest.xml中先添加2个权限, <uses-permission android:name="android.permission. ...
- springMVC实现登陆
页面打开跳转到登陆页面 登陆成功跳转到成功页面 登陆失败再次返回登录页面,并增加提示信息 1.首页跳转到登陆页面 Tomcat服务器启动时默认加载WEB-INF下的index.jsp,可以通过修改xm ...
- (二)Basic Concepts 基本概念
Basic Concepts There are a few concepts that are core to Elasticsearch. Understanding these concepts ...