题目出处: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. SpringBoot-Web-初见

    目录 怎么开发一个网站? 静态资源 找到静态资源的存放目录 扩展自定义路径 首页定制 模板引擎Thymeleaf 员工管理系统-初见 国际化 国际化实现 编写国际化配置类 登陆功能 编写index.h ...

  2. 三剑客之sed编辑器 基操

    目录: 一.sed编辑器 二.打印内容 三.使用地址 四.删除行 五.替换 六.插入 一.sed编辑器 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流. sed ...

  3. CommonsCollections3 反序列化利用链分析

    InstantiateTransformer commons-collections 3.1 中有 InstantiateTransformer 这么一个类,这个类也实现了 Transformer的t ...

  4. 【第一篇】- Git 教程之Spring Cloud直播商城 b2b2c电子商务技术总结

    Git 教程 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制 ...

  5. Linux中不用用户可以使用相同的uid

    usermod -u 513 -o  tom 使得用户tom可以使用uid等于513,即使513已经被其他用户使用了

  6. 解决sofaboot项目右键入口方法没有run sofa application

    选中入口方法名,右键出现run sofa application

  7. DevOps与CICD简介

    整体知识点 ·Devops与CI/CD简介 ·Gitlab安装与Git命令使用 ·Gitlab实现持续集成 ·Gitlab实现分支管理 ·Jenkins简介及安装 ·Jenkins插件管理及基础配置 ...

  8. js正则常用方法

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>W3 ...

  9. Hive——安装以及概述

    一.hive的安装 注意:安装hive的前提要安装好MySQL和Hadoop Hadoop安装:https://www.cnblogs.com/lmandcc/p/15306163.html MySQ ...

  10. P4091-[HEOI2016/TJOI2016]求和【斯特林数,NTT】

    正题 题目链接:https://www.luogu.com.cn/problem/P4091 题目大意 给出\(n\),求 \[\sum_{i=0}^n\sum_{j=0}^i\begin{Bmatr ...