题目描述

$SLON$是一个调皮的学生,为了让他静下心来,老师给他出了一道数学题:
给定表达式$A$,$A$中含有变量$x$和$+,-,*,(,)$这些符号,括号成对出现,一个算术运算符均对应两个操作数,不能出现$(-5)$或者$(4+-5)$等,乘号不能省略,并且表达式$A$中$x$只能是一阶,即一阶表达式:
合理表达式
$$A=\left\{\begin{array}{c}5 + x∗(3 + 2)\\x + 3∗x + 4∗(5 + 3∗(2 + x−2∗x))\end{array}\right.$$
不合理表达式
$$A=\left\{\begin{array}{c}5∗(3 + x∗(3 + x))\\x∗(x + x∗(1 + x))\end{array}\right..$$
求$A(mod)M==P$时,最小的 $x$.

输入

第一行输入一个表达式$A,(1≤|A|≤100000)$。
第二行输入两个整数$P (0 ≤ P ≤ M −1)、M (1 ≤ M ≤ 1000000)$。

样例一
5+3+x
9 10
样例二
20+3+x
0 5 样例三
3*(x+(x+4)*5)
1 7

输出

输出最小的非负$x$。

样例一
1
样例二
2
样例三
3

题解

一道十分经典的字符串处理四则运算题。
可以作为处理四则运算的典例。
首先,我们应该先搞清楚这个题的难点到底是什么。
其实看过题目都应该知道,处理字符串应该是这个题的核心难点
至于什么取模什么相等的都去死吧,我要用爆搜之剑审判你
那么,这个有四则运算在其中的字符串应该如何处理呢?
那么,这里就有了许多种处理字符串的方式:

1.保持原有中则表达式,利用栈处理字符串
2.将中则表达式转为后缀表达式,利用栈与递归处理
3.(实在不知道这种思路叫什么)将每一个数字与一个运算符绑在一起,利用递归处理字符串。
这篇文章将侧重讲解第二种方法 ~~(不然为什么把它放在最后面)~~ 
首先,我们来看一下这道题处理麻烦的原因:
 - 括号改变计算顺序
 - 字符$x$既不是运算符
 - 括号前若有$'-'$,那么括号里面的所有符号(除乘号)都要进行**反转**操作
 - $'*'$与$'+'('-')$一起时,应先计算乘号的内容
也就是说,如果我们把以上问题处理好,那么此题就迎刃而解了。
要解决以上问题,这里要用一种封装思想:
这道题题目似乎很难,但是可以浓缩为几句话
将一个四则表达式化简为$Kx+B$,且使得$$(Kx+B)modM==P$$这就是这道题的精髓。
也就是说,我们要得到的是$K$与$B$,而所谓封装,就是将每一个括号(也不一定是括号)的$K$与$R$装进一个$struct$或者是$pair$中,再用这个$struct$或者$pair$与其他的直接进行加、减、乘即可。(这句话十分重要,但若是不懂,看看代码应该也能理解)
剩下的,和一般的四则运算处理就差不多了。
那么我们定义:$pair$中的$first$为当前算式中$x$的系数,$second$为常数的值。
通过$pair$的两个数的定义,很容易就可以得出两个$pair$相加、减、乘时的具体操作。
为了更方便理解,这里我用数学符号进行推到(其实十分简单)
通过$pair$定义,令$pair_1=(K_1,B_1)$,$pair_2=(K_2,B_2)$.
那么$$pair_1±pair_2=(K_1x+B_1)±(K_2x+B_2)$$$$=>pair_{return}=(K_1±K_2,B_1±B_2)$$紧接着$$pair_1*pair_2=(K_1x+B_1)(K_2x+B_2)$$$$=>原式=K_1K_2x^2+(K_1+K_2)x+B_1B_2$$注意,因为题目保证这是一个一元一次的方程,那么$K_1$、$K_2$中必有一个为$0$,那么就不用考虑$x^2$了,那么$$pair_{return}=(K_1B_2+K_2B_1,B_1B_2)$$其他的操作就比较简单了。
下见代码。
 1 #include<cstdio>
2 #include<stack>
3 #include<cstring>
4 #include<utility>
5 using namespace std;
6 typedef long long LL;
7 typedef pair<LL,LL> pll;
8 #define mp(a,b) make_pair(a,b)
9 #define ft first
10 #define sd second
11 inline LL read(){
12 #define cg (c=getchar())
13 LL x,f=1;char c;
14 while(cg<'0'||'9'<c)if(c=='-')f=-1;
15 for(x=(c^48);'0'<=cg&&c<='9';x=(x<<1)+(x<<3)+(c^48));
16 return x*f;
17 #undef cg
18 }
19 const LL MAXL=100000;
20 char str[MAXL|1];
21 LL P,M,len;
22 pll operator+(const pll& a,const pll& b){
23 //处理两个pair相加
24 return mp((a.ft+b.ft)%M,(a.sd+b.sd)%M);
25 }
26 pll operator-(const pll& a,const pll& b){
27 return mp((a.ft-b.ft+M)%M,(a.sd-b.sd+M)%M);
28 }
29 pll operator*(const pll& a,const pll& b){
30 return mp((a.ft*b.sd+a.sd*b.ft)%M,a.sd*b.sd%M);
31 }
32 bool isnum(char c){
33 return '0'<=c&&c<='9';
34 }
35 stack<char>ch;
36 stack<pll>sta;
37 bool cmpPrio(char a,char b){
38 if(a=='('||b=='(')return 0;
39 if(a=='*'||b=='+'||b=='-'||b==')')return 1;
40 return 0;
41 }
42 pll solve(pll a,pll b,char ord){
43 if(ord=='+')return a+b;
44 if(ord=='-')return a-b;
45 if(ord=='*')return a*b;
46 return mp(0,0);
47 }
48 int main(){
49 scanf("%s",str+1);
50 len=strlen(str+1);
51 P=read(),M=read();
52 str[++len]=')';
53 ch.push('(');
54 for(LL i=1;i<=len;++i){
55 // printf("i==%d\n",i);
56 if(str[i]=='x')sta.push(mp(1,0));
57 else if(isnum(str[i])){
58 LL num=str[i]^48;
59 while(isnum(str[i+1]))
60 num=((num<<1)+(num<<3)+(str[++i]^48))%M;
61 sta.push(mp(0,num));
62 }
63 else{
64 while(cmpPrio(ch.top(),str[i])){
65 pll x,y;
66 x=sta.top();
67 sta.pop();
68 y=sta.top();
69 sta.pop();
70 sta.push(solve(y,x,ch.top()));
71 ch.pop();
72 }
73 if(str[i]==')')ch.pop();
74 else ch.push(str[i]);
75 }
76 }
77 pll res=sta.top();
78 for(LL i=0;i<=M;++i)if((res.ft*i+res.sd)%M==P)
79 return !printf("%lld\n",i);
80 return 0;
81 }

[多校联考]SLON!!!的更多相关文章

  1. 三校联考 Day3

    三校联考 Day3 大水题 题目描述:给出一个圆及圆上的若干个点,问两个点间的最远距离. solution 按极角排序,按顺序枚举,显然距离最远的点是单调的,线性时间可解出答案. 大包子的束缚 题目描 ...

  2. 【赛时总结】NOIP2018-三校联考1024

    ◇NOIP三校联考-1024◇ 发现以前的博客写得似乎都很水……基本上都没什么阅读量QwQ 决定改过自新╰( ̄ω ̄o) 就从这篇博客开始吧~ 现场考得无地自容,看到题解才发现一些东西……(我第三题还没 ...

  3. [2019多校联考(Round 6 T3)]脱单计划 (费用流)

    [2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...

  4. [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)

    [多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...

  5. [多校联考2019(Round 5 T2)]蓝精灵的请求(二分图染色+背包)

    [多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包) 题面 在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为 ...

  6. [多校联考2019(Round 5 T3)]青青草原的表彰大会(dp+组合数学)

    [多校联考2019(Round 5)]青青草原的表彰大会(dp+组合数学) 题面 青青草原上有n 只羊,他们聚集在包包大人的家里,举办一年一度的表彰大会,在这次的表彰大会中,包包大人让羊们按自己的贡献 ...

  7. 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你

    [五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...

  8. 【五校联考1day2】JZOJ2020年8月12日提高组T1 对你的爱深不见底

    [五校联考1day2]JZOJ2020年8月12日提高组T1 对你的爱深不见底 题目 Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y ...

  9. [2017/5/28]FJ四校联考

    来自FallDream的博客,未经允许,请勿转载,谢谢. 话说这一段时间算是过去了,好久好久之后终于又有联考了  没想到这次到我们学校出题,昨天才想起来,临时花一天赶了一套,我出了一个sbFFT,质量 ...

随机推荐

  1. 20-02-27 hive表的几个问题

    1.hive表的动态分区 2.hive  表如何修改列名 3.group  by  对统计指标的影响  (group by 的本质) 4.row_number 对数据的影响

  2. Codeforces Round #618 E

    题意: 给你一个n的数组,你可以进行无数次,选择区间使得区间内的值相加,然后区间的所有的值变成平均值. 使得最后数组的字典序最小 思路: 最后的数组一定是单调递增的,只要它比之前的平均值数大,就不会操 ...

  3. php.ini修改php上传文件大小限制的方法

    打开php.ini,首先找到file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就 ...

  4. 安卓之文本视图TextView及跑马灯效果

    一.基本属性和设置方法 二.跑马灯用到的属性与方法说明 三.省略方式的取值说明 四.跑马灯效果案例代码   (1)布局xml文件 <?xml version="1.0" en ...

  5. LFTP命令笔记

    安装 因为在OpenWrt命令行下scp传输文件很慢(只有2.5MB/s不到), 于是改用FTP下载. lftp是OpenWrt下的FTP客户端软件. 如果固件中未安装的话, 需要自己安装, 其依赖于 ...

  6. Spring 事务管理的API

    Spring事务管理有3个API,均为接口. (1)PlatformTransactionManager    平台事务管理器 常用的实现类: DataSourceTransactionManager ...

  7. 深入剖析Windows专业版安装Docker引擎和Windows家庭版Docker引擎安装的区别

    原创声明:作者:Arnold.zhao  博客园地址:https://www.cnblogs.com/zh94 公司使用的电脑是Windows专业版,所以配置本机的Docker时会方便许多,后续由于需 ...

  8. 6.Python字符串

    #header { display: none !important; } } #header-spacer { width: 100%; visibility: hidden; } @media p ...

  9. Python:列表类型

    概念 列表:有序的,可变的,元素集合 因为列表和字符串都是序列类型,所以很多操作和字符串很相似 但是注意:列表是可变类型,字符串是不可变类型 定义 基本定义 定义方法:[ 元素1, 元素2, .... ...

  10. layer.open({}) 子页面传参并调用父页面的方法

    闲话少说先看效果!!! 说明适用场景:在a.jsp页面,点击查看一个文件,layer.open弹出b.jsp页面,在b.jsp页面可以修改文件的名称(其实是去改了数据库),但是关闭弹窗的后,要求不刷新 ...