热身训练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( ...
随机推荐
- python模块--calendar
方法 返回值类型 说明 .calendar(theyear, w=2, l=1, c=6, m=3) str 返回指定年份的年历, w: 每个日期的宽度, l: 每一行的纵向宽度, c: 月与月之间的 ...
- 昭山欢node资料学习笔记
以前学过一片node工作没有用,忘了,趁这个春节在整理一片 第一章 快速塔建一个局哉网服务器 const http = require("http");var server = h ...
- Maven专题1——坐标与依赖
1. 坐标 坐标用来唯一定位一个Maven构件: GAV(必需):groupId, artifactId, version packaging(可选): 可取值如:jar(缺省), war, pom, ...
- idea鼠标双击.log日志文件无法打开
发现只要再mybatis-config.xml的起别名中加<package name="xxx"/>,就会导致Reader entry: ���� 1 n乱码,而R ...
- 记一次docker compose的低级错误
记一次docker compose的低级错误 问题 今天在学习dockercompose的时候,启动docker compose up,结果却出现异常 Error response from da ...
- ecshop调用指定栏目下的商品的方法
第一步 在系统目录文件找到includes/lib_goods.php 这个文件打开 在此页最底部加入以下函数代码 /** * 首页获取指定分类产品 * * @access public * @pa ...
- Orchard Core 简介
Orchard Core 是基于ASP.NET Core 对Orchard CMS的 二次开发. Orchard Core由两部分组成: Orchard Core Framework: 一个基于ASP ...
- Shell系列(4)- 历史命令
格式:history [选项] [历史命令保存文件] 选项: -c:清空历史命令 -w:把缓存中的历史命令写入到历史命令保存文件~ /.bash_history;用户的家目录下 例子: [root@l ...
- [手机编程]Aid Learning--换源+数据库安装
换源+MYSQL安装 Aid Learning下载安装 http://www.aidlearning.net/ 切换源 打开Terminal复制回车即可 cd /etc/apt/&& ...
- 对代理IP进行检测是否可用
第一种方法是使用telnetlib import telnetlib import requests from lxml import etree #解析此url页面的IP url = 'http:/ ...