热身训练1 Calculator
题目出处: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的更多相关文章
- 数位dp & 热身训练7
数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...
- 热身训练4 Article
Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ...
- 热身训练4 Eighty seven
Eighty seven 简要题意: n个卡片,其中第i个卡片的数值为$a[i]$.一共q次询问,每次询问将删去其中3个卡片(可能删除若干相同的卡片)后,问能否选出10个卡片,数值之和等于87. n≤ ...
- 热身训练2 The All-purpose Zero
The All-purpose Zero 简要题意: 长度为n的数组,每个数字为S[i],$0$是一种很神奇的数字,你想要的,它都可以变! 问这个序列的最长上升子序列长度为多少? 分析: 我们将除了 ...
- 热身训练3 Palindrome
Palindrome 简要题意: 我们有一个字符串S,字符串的长度不超过500000. 求满足S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)(n≥2)的子串个数. 分析: 我们能通过简 ...
- 热身训练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 ...
- 热身训练2 Another Meaning
题目来源 简要题意: 众所周知,在许多情况下,一个词语有两种意思.比如"hehe",不仅意味着"hehe",还意味着"excuse me". ...
- 热身训练1 ping ping ping
点此进入 题意: 一棵树,n+1 个节点,以0号节点为根,给出端点(a,b),节点a到节点b的路径上,至少有一个点是"坏掉的",求"坏掉的点"最少 分析: St ...
- 热身训练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( ...
随机推荐
- el-table回显遇到的坑
使用element ui 的el-table在做到复选框回显勾中的问题时,整整困惑了我一天,当时百度了一下,好多人都说是 this.$nextTick(() => {})的问提,在组件中监听w ...
- JDK 1.7 正式发布,Oracle 官宣免费提供!“新版任你发,我用JDK 8”或成历史?
Oracle公司JDK 17正式发布,JDK 17属于长期支持(LTS)版本,也就是获得8年的技术支持,自2021年9月至2029年9月截止. JDK 17版本更新了很多比较实用的新特性,关于此版本的 ...
- xshell与小键盘问题
有些程序员的键盘是带有小数字键的,在使用xshell中文版时就可能出现一些小状况,本集就同大家分析一下使用数字键盘出现乱码的情况怎么办. 图1:使用数字小键盘出现乱码 问题描述: 在xshell上用v ...
- vue开发 回到顶部操作
第一种:使用vue-router history 模式下,用scrollBehavior 方法实现. 1 export default new Router({ 2 mode: 'history', ...
- 01_初识C语言
第一章 - 初识C语言 基本了解C语言的基础知识,对C语言有一个大概的认识. 每个知识点就是简单认识,不做详细讲解. 1. 什么是C语言? C语言是一门通用计算机编程语言,广泛应用于底层开发.C语言的 ...
- centos8安装php扩展memcached报错
在php扩展memcached中执行./configure --with-php-config=/usr/local/php/bin/php-config 报错: error: memcached s ...
- 鸿蒙内核源码分析(字符设备篇) | 字节为单位读写的设备 | 百篇博客分析OpenHarmony源码 | v67.01
百篇博客系列篇.本篇为: v67.xx 鸿蒙内核源码分析(字符设备篇) | 字节为单位读写的设备 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...
- 通用JS9
Symbol.toStringTag 该符号作为一个属性表示"一个字符串,该字符串用于创建对象的默认字符串描述."由内置方法Object.prototype.toString()使 ...
- 使用Golang搭建gRPC服务提供给.NetCore客户端调用
目录 gRPC概述 RPC gRPC又是什么呢 安装 Golang IDE(Goland) Protocol Buffer 下载Protocal Buffer 配置Protocal Buffer编译器 ...
- DOC命令和批处理命令
本文章以极简的方式展现,相信能够浏览到这篇文章的人都对批命令有了一定的了解,我不会把文章写的长篇大论 重要!!! (命令/?)查看帮助文档 (命令/help)查看详细帮助文档 附:思维导图 批处理编程 ...