P1054 [NOIP2005 提高组] 等价表达式
题目描述
明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。
这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?
这个选择题中的每个表达式都满足下面的性质:
- 表达式只可能包含一个变量 �a。
- 表达式中出现的数都是正整数,而且都小于 1000010000。
- 表达式中可以包括四种运算 ++(加),--(减),**(乘),^^(乘幂),以及小括号 ((,))。小括号的优先级最高,其次是 ^^,然后是 **,最后是 ++ 和 --。++ 和 -- 的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符 ++,--,**,^^ 以及小括号((,)) 都是英文字符)
- 幂指数只可能是 11 到 1010 之间的正整数(包括 11 和 1010)。
- 表达式内部,头部或者尾部都可能有一些多余的空格。
下面是一些合理的表达式的例子:
((a^1) ^ 2)^3
,a*a+a-a
,((a+a))
,9999+(a-a)*a
,1 + (a -1)^3
,1^10^9
………
输入格式
第一行给出的是题干中的表达式。
第二行是一个整数 �n,表示选项的个数。后面�n行,每行包括一个选项中的表达式。这 �n 个选项的标号分别是 �,�,�,�⋯A,B,C,D⋯
输入中的表达式的长度都不超过 5050 个字符,而且保证选项中总有表达式和题干中的表达式是等价的。
输出格式
一行,包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。
输入输出样例
输入 #1复制
( a + 1) ^2 3 (a-1)^2+4*a a + 1+ a a^2 + 2 * a * 1 + 1^2 + 10 -10 +a -a
输出 #1复制
AC
说明/提示
- 对于 30%30% 的数据,表达式中只可能出现两种运算符 ++ 和 --;
- 对于其它的数据,四种运算符 ++,--,**,^^ 在表达式中都可能出现。
- 对于 100%100% 的数据,表达式中都可能出现小括号 (( 和 )),2≤�≤262≤n≤26。
【题目来源】
NOIP 2005 提高组第四题
余观此题,未生特殊代值之意,徒有多项式运算之情。所以然者何?变量单一,形式有限,假一数组,以次数顺列系数,则神形兼备,功能俱全。遂写结构,用重载。又用栈,以计算。
说明白点,就是直接拿个结构体,用多项式每项前的系数存成一个数组,来表示多项式,然后通过重载运算符来支持多项式的各种运算。但这里有个问题,就是a的最高次数可能远远超过10。事实上,有一个测试点的数据就有
(a -6)^10^10
所以多项式数组的大小不能只开到11。但这样的话,这个数组岂不是要开的非常大?然而既然可以用代特殊值的方法来做,我以为,算一下目标和结果的“较低”次数也可以管中窥豹略见一斑。即:如果两个多项式在�N次以内的系数都相等,并且�N足够大的时候,也可以判定两个多项式是相等的。这里�N取到100就可以过这题了,也不会出现TLE的问题。这个题解之前没有考虑溢出的问题,最近经过评论区提醒,系数数组需要开long long
。
但严格来说,将系数对大数(如1e9+7)取模是更严谨的做法。这种做法另一个问题就是代码量比较大,可能需要比较长的编码调试时间。这个思路主要优势是比较直观,也容易想到。另外写的这个struct非常实用。print()稍微完善一下,或者不完善,因为也能看懂,这已经可以用来做数学作业啦!
(原题解发布于2018-09-24,2021-02-25更新)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<vector>
#include<stack>
#include<string>
#define N 100
using namespace std; struct poly{long long p[N+2];void clear(){memset(p, 0, sizeof(p));}poly operator= (const poly &b){this->clear();for (int i=0; i<=N; i++) p[i]=b.p[i];return *this;}poly operator= (const int b){this->clear();p[0]=b;return *this;}poly operator+ (const poly &b) const{poly c;for (int i=0; i<=N; i++){c.p[i]=p[i]+b.p[i];}return c;}poly operator- (const poly &b) const{poly c;for (int i=0; i<=N; i++){c.p[i]=p[i]-b.p[i];}return c;}poly operator* (const poly &b) const {poly c;c.clear();for (int i=0; i<=N; i++){for (int j=0; j<=N; j++){if (i+j>N) continue;int k=i+j;c.p[k]+=p[i]*b.p[j];}}return c;}poly pow(const poly &b) const {//b must be an integer.int t=b.p[0];poly ans; ans=1;poly pas; pas=(*this);while (t){if (t&1) {ans=ans*pas;}pas=pas*pas;t>>=1;}return ans;}void print(){for (int i=N; i>=0; i--){if (p[i]==0) continue;if (i!=N) cout<<'+';cout<<p[i]<<"a^"<<i;}cout<<endl;}bool operator== (const poly&b) const {for (int i=0; i<=N; i++){if (p[i]!=b.p[i]) return false;}return true;}};stack<poly> s1;
stack<char> s2;inline int f(char c){if (c=='^') return 3;if (c=='*' ) return 2;if (c=='+' || c=='-') return 1;else return 0;
}inline void js(){poly a, b; char c;poly ans;b=s1.top(); s1.pop();a=s1.top(); s1.pop();c=s2.top(); s2.pop();if (c=='+') ans=a+b;if (c=='-') ans=a-b;if (c=='*') ans=a*b;if (c=='^') ans=a.pow(b);s1.push(ans);
}const char L[18]="0123456789+-*^a()";inline bool legal(char c){for (int i=0; i<17; i++){if (c==L[i]) return true; }return false;
}inline poly read(){string s;getline(cin, s);int len=s.size();int judge=0; bool ok=1;if (s.empty()) ok=0;for (int i=0; i<len; i++){if (s[i]=='(') judge++;if (s[i]==')') judge--;if (judge<0) ok=0;}if (judge>0) ok=0;if (!ok) {poly wrong; wrong.clear(); wrong.p[N+1]=1; return wrong;}//gets(s);bool flag=0; int temp=0; poly pt;poly a; a.clear(); a.p[1]=1;for (int i=0; i<len; i++){char &n=s[i];if (!legal(n)) continue;if (n=='a') {s1.push(a); continue;}if (n>='0' && n<='9') {temp=(temp<<1)+(temp<<3)+n-'0'; flag=1; continue;}if (flag) {pt=temp; s1.push(pt); temp=0; flag=0;}if (n=='(') {s2.push(n); continue;}if (n==')') {while (s2.top()!='(') js();s2.pop();continue;}while (!s2.empty() && f(s2.top())>=f(n)) js();s2.push(n);}if (flag) {pt=temp; s1.push(pt);}while (!s2.empty()) js();poly res=s1.top();s1.pop();return res;//s1.top().print();
}int main(){poly aim; aim=read();//aim.print();int n; scanf("%d\n", &n); for (int i=0; i<n; i++){poly now=read();//now.print();if (now==aim) {char c='A'+i; cout<<c;}}cout<<endl; return 0;
}
相关文章:
P1054 [NOIP2005 提高组] 等价表达式
题目描述 明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式…...
什么牌子蓝牙耳机好用不贵?国产性价比高的蓝牙耳机推荐
相较于有线耳机,无线蓝牙耳机更便携、功能更丰富,不用受到耳机孔与线的限制。那么,什么牌子的蓝牙耳机好用不贵?针对这个问题,我给大家推荐几款国产性价比高的蓝牙耳机,可以当个参考。 一、南卡小音舱Lite…...
明明花钱上了ERP,为什么还要我装个MES系统
目前, ERP系统依旧是很多制造企业的选择。据统计,ERP系统的应用已经达到70%以上,但是在车间的应用, MES系统的应用比例并不高。那么,为什么现在很多企业又都选择再上个MES呢? MES系统是一个面向…...
JAVA中的集合框架有哪些?
在Java中,集合(Collection)是一组对象的容器,而集合框架(Collection Framework)是一组接口、实现类和算法,用于存储和操作集合。Java集合框架提供了一组通用的、高性能的、可扩展的接口和类&…...
用Jmeter进行接口自动化测试的工作流程你知道吗?
目录 测试流程 接口测试相关文档管理规范 接口测试要点 测试流程 在测试负责人接受到测试任务后,应该按照以下流程规范完成测试工作。 2.1 测试需求分析 产品开发负责人在完成某产品功能的接口文档编写后,在核对无误后下发给对应的接口测试负责人…...
Java 中的设计模式有哪些?(十九)
Java设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 设计模式可以帮助我们解决软件开发过程中面临的一般问题,提高代码的可读性、可复用性和可扩展性。 Java中一般认为有23种设计模式,总体来说设计模式分为三大类&…...
奇数单增序列
题目描述 给定一个长度为 N(不大于 500)的正整数序列,请将其中的所有奇数取出,并按升序输出。 输入格式 第 1 行为 N;第 2 行为 N 个正整数,其间用空格间隔。 输出格式 增序输出的奇数序列,…...
Seata介绍
介绍: Seata的设计目标是对这个业务无侵入,因此从业务无侵入的2PC方案开始的,在传统的2PC的基础上演进的。它把一个分布式事务拆分理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分支事务达成一致性,要…...
VK Cup 2017 - Round 1 A - Bear and Friendship Condition(并查集维护大小 + dfs 遍历图统计边数)
题目大意: 给你一些n个点m条边,如果三个点(a,b,c)是合法的,当且仅当 a-b,b-c,c-a都有一条边,问你这个图是否合法,如果有一个或两个点视为合法 思路 考虑什么图才是个合法图:除了点…...
为UOS启用VNC和Windows远程桌面
1 参考资料 UOS系统中安装x11vnc远程桌面 如何通过windows电脑远程UOS桌面RDP 已在ARM版本和X86版本中验证均可用 2 准备工作 2.1 设置代理(可选) 如果设备本身能和公网通,就不需要了。 由于我们全程需要在root账号下进行,系…...
Java时间类(七)-- LocalDateTime()类
目录 1. LocalDateTime的概述: 2. LocalDateTime的常用方法: 1. LocalDateTime的概述: 是一个不可变的日期-时间对象,表示日期和时间,而没有时区。 它基于ISO-8601日历系统,是由日期和时间组合而成。它可以存储到纳秒级精度,并提供了各种方法来处理日期和时间的运算…...
卢北辰:数据点亮梦想,能力驱动人生 | 提升之路系列(九)
导读 为了发挥清华大学多学科优势,搭建跨学科交叉融合平台,创新跨学科交叉培养模式,培养具有大数据思维和应用创新的“π”型人才,由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…...
数据库基础及用户管理授权
数据库概念 关系型数据库 数据结构二维表格 库 -> 表 -> 列(字段):用来描述对象的的一个属性;行:用来描述一个对象的信息 mysql(5.7/8.0) maridb ocracle postgresql sqlserver(windows…...
比特米盒子刷安卓ATV6.0
最近海鲜市场有很多比特米盒子,50多块包邮,买来的盒子回来折腾下,买回来发现一直卡在“系统启动"中无法进入,不知道原来的是啥系统,看来只能找找线刷的办法,重新拯救救个这盒子。 原文链接地址&#x…...
【用python的QT做信号处理的界面】
文章目录 入口文件界面参数调整数据从dat解析出来的文件从界面点击打开文件夹的功能实现主要功能代码网络参数存图替换功能,比如把倒频谱替换成倒频谱2 入口文件 入口文件,主要用来实例化窗口(不重要),只要知道从这里…...
【Linux】进程间通信 —— 管道
文章目录 📕 进程间通信介绍📕 匿名管道原理使用读写规则特点 📕 命名管道原理使用匿名管道和命名管道的区别 📕 进程间通信介绍 进程间通信,顾名思义,就是两个进程之间的 “交流” ,我们知道&…...
知识管理在企业中的重要性
随着经济全球化和信息化的快速发展,企业面临着越来越多的竞争和挑战。如何把握市场动态、满足客户需求、提高产品质量和效率等,成为了企业发展中亟待解决的问题。而知识管理作为一种新兴的管理方式,逐渐引起了企业们的重视。本文将从以下几个…...
Socks5、网络安全、代理IP技术详解
随着互联网的发展,网络安全问题越来越受到人们的关注。为了保护个人隐私和网络安全,使用代理服务器成为了一种普遍的选择。其中,Socks5协议是一种常见的代理协议,而代理IP是使用代理服务器时经常需要考虑的问题。本文将深入探讨So…...
C++学习day--09 字符串比较、运算符
1、项目练习 第 1 节 项目需求、项目实现 项目实现: #include <iostream> #include <Windows.h> #include <string> using namespace std; int main( void ) { string name; string pwd; std::cout << " 请输入账号&am…...
缓存和数据库一致性问题
如何保证缓存和数据库一致性,这是一个老生常谈的话题了。 但很多人对这个问题,依旧有很多疑惑: 到底是更新缓存还是删缓存? 到底选择先更新数据库,再删除缓存,还是先删除缓存,再更新数据库&am…...
4月京东生鲜水果行业数据报告:榴莲销量增长400%,市场格局剧变
众所周知,今年水果领域的一个重磅消息就是:榴莲价格暴跌。目前全国多地线下水果专卖店、农贸市场的榴莲价格都在下滑,有的地区在4月底甚至已经降至最低每斤20元左右。预测在5月的销售旺季,价格还有望一路向下。 •榴莲逆袭苹果&am…...
Windows无法完成格式化怎么办?正确的3个解决方法!
案例:Windows无法完成格式化怎么办 【由于我的U盘使用时间过长,很多文件都是不需要的,我想将其格式化,但插入电脑后,Windows根本无法完成格式化,这是为什么呢?我应该怎么做呢?求答案…...
基于aspnet个人博客网站dzkf6606程序
系统使用Visual studio.net2010作为系统开发环境,并采用ASP.NET技术,使用C#语言,以SQL Server为后台数据库。 1.系统登录:系统登录是用户访问系统的路口,设计了系统登录界面,包括用户名、密码和…...
不黑艺术学社京藏行——参观五台山孙溟㠭为五台山红英师治印
不黑学社社长孙溟㠭先生与五台山菩萨顶主事红英师 不黑学社京藏行,路经五台把佛拜。 巍巍五台清凉境,参访伊始菩萨顶。 感恩“天珠”刘诗语,芬芳佛语满香华。 感恩慈悲红英师,带众参拜大白塔。 菩萨顶上如意宝,莲…...
mysql数据之表管理-mysql高级管理
1. #创建表tt01 #对id字段设置零填充约束、主键约束、自增长约束 #对name字段设置非空约束、默认值约束 #对cardid字段设置非空约束、唯一键约束 插入数据记录: 1)因为id字段设置了自增长,如果不指定id字段值,则默认从1开始递…...
公司新来的00后真是卷王,工作没2年,跳槽到我们公司起薪18K都快接近我了
说00后躺平了,但是有一说一,该卷的还是卷。这不,前段时间我们公司来了个00后,工作都没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 …...
面试题30天打卡-day19
1、TCP 和 UDP 协议有什么区别,分别适用于什么场景? TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种常用的传输层协议,两者的区别比较如下: TCPUDP可靠性…...
ASEMI代理ADI亚德诺LTC6992IS6-1#TRMPBF车规级芯片
编辑-Z LTC6992IS6-1#TRMPBF参数描述: 型号:LTC6992IS6-1#TRMPBF 输出频率:3.81Hz 工作电源电压范围:2.25 - 5.5V 通电复位电压:1.95V 电源电流:105-365A SET引脚处的电压:1V 频率设置电…...
Oracle PL/SQL基础语法学习15:静态表达式
系列文章目录 Oracle PL/SQL基础语法学习12:短路求值 Oracle PL/SQL基础语法学习13:比较运算符 Oracle PL/SQL基础语法学习14:BOOLEAN表达式 文章目录 系列文章目录前言Oracle PL/SQL基础语法学习15:静态表达式Static Expression…...
B-Tree (多路查找树)分析-20230503
B-Tree (多路查找树)学习-20230503 前言 B-树是一类多路查询树,它主要用于文件系统和某些数据库的索引,如果采用二叉平衡树访问文件里面的数据,最坏情况下,磁头可能需要进行O(h)次对磁盘的读写,其中h为树的高度&…...
公司网址正确格式/进一步优化
linux下使用crontab很顺利,没遇到什么问题,直接crontab -e添加任务即可,可是在Solaris下却碰到些问题,没有按计划执行指定任务,问题解决后,简要总结一下Solaris下crontab的用法:a、添加操作bash…...
网站设计公司 宁波/百度经验app
点击上方“河北经济日报”加关注今天下午,在广东东莞举行的华为2019年开发者大会上,华为正式发布全新分布式操作系统:鸿蒙!据介绍,鸿蒙是基于微内核的全场景分布式OS,可支撑各种不同的设备,包括…...
dw软件做的东西怎么在网站用/营销网站建设哪家快
2019独角兽企业重金招聘Python工程师标准>>> 队列:先进先出 栈:先进后出; 实现栈:有队列1有队列2。实现原理,始终保持一个队列为空队列。取元素时,将不为空的队列所有元素减一全部放入另外一个队列。将最后…...
阳谷网站建设/近日发生的重大新闻
Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意)编写客户机的代码访问该端口客户机按行输入服务器将收到的字符流和接收到的时间输出在服务器console原样返回给客户机在客户机console显示出来代码实现 /* UDPEchoClient.java */ import java.…...
在线做txt下载网站/2022新闻大事件摘抄
1、 段机制启动、页机制未启动:逻辑地址->段机制处理->线性地址物理地址 段机制和页机制都启动:逻辑地址->段机制处理->线性地址->页机制处理->物理地址 段机制和页机制实际上是一种映射关系...
怎样做金融理财网站/网站宣传
本文同步自我的博客 Reeoos Blog,欢迎移步前往,^_^ 概览 本文基于React Router v1.03版本。React Router是一个为React设计的强大的路由库。可以帮助我们快速的实现路由功能,包括URL和React components之间的同步映射关系。在解释React Route…...