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 ...
随机推荐
- 测者的测试技术笔记:揭开java method的一个秘密--巨型函数
相信,很多人都不知道Java的Method的上限为64K.本文将超过这个上限的函数叫做巨型函数. 巨型函数的问题 1.如果代码超过了这个限制,Java编译器就报"Code too large ...
- ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
一.前言 1.本教程主要内容 ASP.NET Core MVC 视图引擎(Razor)简介 ASP.NET Core MVC 视图(Razor)ViewData使用示例 ASP.NET Core MV ...
- 使用jquery实现选项卡切换效果
几张简陋的框架效果图 页面加载时: 选项卡操作后: css样式: <style type="text/css"> *{margin:0px;padding:0px;} ...
- Python基础——3特性
特性 切片 L=[0,1,2,3,4,5,6,7,8,9,10] L[:3]=[0,1,2] L[-2:]=[9,10] L[1:3]=[1,2] L[::3]=[0,3,6,9] L[:5:2]=[ ...
- Python 函数调用&定义函数&函数参数
一.函数调用 在python中内置了很多函数,我们可以直接调用 .想要调用函数首先要知道函数的名称及包含的参数,还可以通过查看python官方的文档:https://docs.python.org/3 ...
- Python基础之面对对象进阶
阅读目录 isinstance和issubclass 反射 setattr delattr getattr hasattr __str__和__repr__ __del__ item系列 __geti ...
- SQLAlchemy增删改查
sqlalchemy中让MySQL支持中文字符 engine = create_engine("mysql+pymysql://root:mysql8@localhost/mysqltest ...
- jar包的MANIFEST.MF文件
打包可执行jar包时,MANIFEST.MF总是个让人头疼的东西,经常出现这种那种问题. 一个例子: ================================================= ...
- Spring的事件机制详解
同步事件和异步事件 同步事件:在一个线程里,按顺序执行业务,做完一件事再去做下一件事. 异步事件:在一个线程里,做一个事的同事,可以另起一个新的线程执行另一件事,这样两件事可以同时执行. 用一个例子来 ...
- 洛谷P4431
题意翻译 题目大意: 给定一个n∗m的矩阵,每次你可以选择前进一格或转弯(90度),求在不出这个矩阵的情况下遍历全部格点所需最少转弯次数.有多组数据 输入格式: 第一行一个整数k,表示数据组数 以下k ...