题目出处:Calculator

简要题意:

你有一个确定的函数,f(x)=+...*...^...,其中共有n个操作,从左到右依次计算。

共有m次询问,我们每次询问,1.会修改f(x)中的操作;2.输出f(x)%29393

分析:

分解29393可以得到7*13*17*19,这几个数都很小,很容易预处理!

于是我们可以将一个f(x)%29393分成四个小方程

我们令 a1=f(x)%7; a2=f(x)%13; a3=f(x)%17; a4=f(x)%19。

那么由中国剩余定理,可以得到模29393意义下的唯一解

虽说CRT求得的,是所有正整数解的最小解,

但是,由上图我们可以知道,如果我们最终的答案要模上29393,那么CRT求得的答案就是唯一解。

接下来,我们只需要能够快速求得这四个数,即可用CRT求得答案。

由于这4个模数都很小,我们可以提前预处理出 当x小于模数时的f(x)的值

我们可以用线段树来实现函数功能!

tr[p].val[i][j] = tr[rs].val[i][tr[ls].val[i][j]];

其中val[i][j]表示:处理第i个模数,输入的x值为j

由于我们的计算是从左到右依次计算,所以父亲节点的val值,为当“输入值为左儿子x的返回值时”的右儿子的返回值。

当我们要修改函数时,只需要从叶子节点开始修改,一步一步推到根节点即可。

最后我们的a1,a2,a3,a4分别为根节点处的val[1][x],val[2][x],val[3][x],val[4][x]

#include<bits/stdc++.h>
using namespace std;
#define re register int
#define LL long long
#define int long long
const int N=5e4+5;
inline int ksm(int x, int y, const int pp)
{
x %= pp;
y %= (pp-1);
int ret = 1;
while(y)
{
if(y&1) ret = ret*x%pp;
x=x*x%pp;
y>>=1;
}
return ret;
}
const LL chu[5]={7, 13, 17, 19};
const LL MOD = 29393;
struct segment{int a, b, val[5][20];}tr[N<<2];
void build(const int p, const int l, const int r)
{
tr[p].a=l; tr[p].b=r;
if(l != r)
{
int mid=(l+r)>>1, ls=p<<1, rs=p<<1|1;
build(ls, l, mid);
build(rs, mid+1, r);
for(re i=0;i<4;++i)
for(re j=0;j<chu[i];++j)
tr[p].val[i][j] = tr[rs].val[i][tr[ls].val[i][j]];
}
else
{
int ty, x;char ch;
scanf("%c%lld",&ch,&x);
if(ch=='+')ty=0;else if(ch=='*')ty=1;else ty=2;
getchar();
for(re i=0;i<4;++i)
{
for(re j=0;j<chu[i];++j)
{
if(ty == 0) tr[p].val[i][j] = (j+x)%chu[i];
if(ty == 1) tr[p].val[i][j] = j*x%chu[i];
if(ty == 2) tr[p].val[i][j] = ksm(j, x, chu[i]);
}
}
}
}
void modi(const int p, const int pos, const int x, const int ty)
{
if(tr[p].a == pos && pos == tr[p].b)
{
for(re i=0;i<4;++i)
{
for(re j=0;j<chu[i];++j)
{
if(ty == 0) tr[p].val[i][j] = ((j+x)%chu[i]+chu[i])%chu[i];
if(ty == 1) tr[p].val[i][j] = j*x%chu[i];
if(ty == 2) tr[p].val[i][j] = ksm(j, x, chu[i]);
}
}
return;
}
int mid=(tr[p].a+tr[p].b)>>1, ls=p<<1, rs=p<<1|1;
if(pos <= mid) modi(ls, pos, x, ty);
else modi(rs, pos, x, ty); for(re i=0;i<4;++i)
for(re j=0;j<chu[i];++j)
tr[p].val[i][j] = tr[rs].val[i][tr[ls].val[i][j]];
}
inline LL getans(const int pp)
{
LL ret=0;
for(re i=0;i<4;++i)
{
int Mi=MOD/chu[i];
int t=ksm(Mi,chu[i]-2,chu[i]);
ret=(ret+tr[1].val[i][pp%chu[i]]*Mi*(t%chu[i]))%MOD;
}
return (ret+MOD) % MOD;
}
int n, m;
inline void work()
{
scanf("%lld%lld",&n,&m);
getchar();
build(1, 1, n);
for(re i=1;i<=m;++i)
{
int op, x, y, t;char ch;
scanf("%lld",&op);
if(op == 1)
{
scanf("%lld",&x);
getchar();
printf("%lld\n", getans(x));
}
else
{
scanf("%lld",&x);
getchar();
scanf("%c%lld",&ch,&y);
if(ch=='+')t=0;else if(ch=='*')t=1;else t=2;
modi(1, x, y, t);
}
}
}
signed main()
{
int T; scanf("%lld",&T);
for(re h=1;h<=T;++h)
{
printf("Case #%lld:\n", h);
work();
}
}

“我不怕千万人阻拦,只怕自己投降”----《倔强》五月天

热身训练1 Calculator的更多相关文章

  1. 数位dp & 热身训练7

    数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...

  2. 热身训练4 Article

    Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ...

  3. 热身训练4 Eighty seven

    Eighty seven 简要题意: n个卡片,其中第i个卡片的数值为$a[i]$.一共q次询问,每次询问将删去其中3个卡片(可能删除若干相同的卡片)后,问能否选出10个卡片,数值之和等于87. n≤ ...

  4. 热身训练2 The All-purpose Zero

    The All-purpose Zero 简要题意:  长度为n的数组,每个数字为S[i],$0$是一种很神奇的数字,你想要的,它都可以变! 问这个序列的最长上升子序列长度为多少? 分析: 我们将除了 ...

  5. 热身训练3 Palindrome

    Palindrome 简要题意:  我们有一个字符串S,字符串的长度不超过500000. 求满足S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)(n≥2)的子串个数.  分析: 我们能通过简 ...

  6. 热身训练2 GCD

    题目描述 简要题意:  n个数字,a1,a2,...,an m次询问(l,r),每次询问需回答 1.gcd(al,al+1,al+2,...,ar);2.gcd(ax,ax+1,ax+2,...,ay ...

  7. 热身训练2 Another Meaning

    题目来源 简要题意: 众所周知,在许多情况下,一个词语有两种意思.比如"hehe",不仅意味着"hehe",还意味着"excuse me". ...

  8. 热身训练1 ping ping ping

    点此进入 题意: 一棵树,n+1 个节点,以0号节点为根,给出端点(a,b),节点a到节点b的路径上,至少有一个点是"坏掉的",求"坏掉的点"最少 分析: St ...

  9. 热身训练1 Problem B. Harvest of Apples

    http://acm.hdu.edu.cn/showproblem.php?pid=6333 题意: 求 C(0,n)+C(1,n)+...+C(m,n) 分析: 这道题,我们令s(m,n) = C( ...

随机推荐

  1. vue+element+echarts柱状图+列表

    前端由vue+element搭建框架,引入vue和element的index.js和css就可以写页面: 页面和js可以echarts官网实例看下都是有的,主要看下如何动态赋值: 柱状图和列表: &l ...

  2. JNDI注入基础

    JNDI注入基础 一.简介 JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API,命名服务 ...

  3. servlet请求转发于重定向

    请求的转发与重定向是Servlet控制页面跳转的主要方法,在Web应用中使用非常广泛. 一. 请求的转发 Servlet接收到浏览器端请求后,进行一定的处理,先不进行响应,而是在服务器端内部" ...

  4. Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现

    环境 .NET5,Consul_v1.10.2 一.简介 在微服务中利用Consul可以实现服务的注册,服务发现,治理,健康检查等. Web调站点需要调用多个服务,如果没有Consul,可能就是Web ...

  5. RMQ区间最值查询

    RMQ区间最值查询 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A, 回答若干询问RMQ(A,i,j)(i,j<= ...

  6. jquery播放视频事件

    $('video').trigger('play'); $('video').trigger('pause'); 判断video播放器的播放状态,并进行切换播放,需要这样 let video = $( ...

  7. linux7可以通过远程和localhost访问mysql,但是127.0.0.1不能访问

    网上搜索的其他方法都试过,不行 比如设置权限,开放端口,配置数据库... 最好偶然一个搜索查看可能原因是防火墙端口问题: vim /etc/sysconfig/iptables 在文件中添加下面语句 ...

  8. Docker系列(14)- Portainer可视化面板安装

    官网 https://documentation.portainer.io/v2.0-be/deploy/beinstalldocker/ 可视化 portainer docker run -d -p ...

  9. 远程连接centos7中mysql8.0

    远程连接centos7中mysql8.0 1.使用Navicat for MySQL或者其它数据连接软件 2.先检查centos中防火墙是否关闭,如果关闭不需要设置,如果没有关闭防火墙,请打开3306 ...

  10. Viterbi 算法 Python实现 [NLP学习一]

    最近思考了一下未来,结合老师的意见,还是决定挑一个方向开始研究了,虽然个人更喜欢鼓捣.深思熟虑后,结合自己的兴趣点,选择了NLP方向,感觉比纯粹的人工智能.大数据之类的方向有趣多了,个人还是不适合纯粹 ...