NC21181 重返小学
NC21181 重返小学
题目
题目描述
时光依旧,岁月匆匆。转眼间,曾经的少年郭嘉烜已经长大成人,考上了一所优秀的大学——兰州大学。在经历了一年来自牛顿、莱布尼茨、拉普拉斯的精神洗礼后,他终于决定回到小学,重新回到加减乘除的怀抱中。
输入描述
第一行,一个整数 \(T (1≤T≤100000)\),表示案例的个数。
接下来的T行,每行一个字符串(长度小于等于 \(100\) ),字符串仅由0-9、+、-、*、/、^、!字符组成,数字表示一个数值,范围为 \([0,9]\),且数字不存在前导零,其他符号表示一种运算规则,规则的描述如下:
+:数字1 +数字2 =两个数字之和,+号的优先级为1
-:数字1 -数字2 =两个数字之差,-号的优先级为1
*:数字1 * 数字2 =两个数字之积,* 号的优先级为2
/:数字1 /数字2 =两个数字之商(舍去小数),/号的优先级为2
^:数字1 ^数字2 =数字1的数字2次方,^号的优先级为3
!:数字1 ! =数字1的阶乘,!号的优先级为4
按照优先级从高到低的顺序依次计算,同级运算时,从左到右依次计算。
输入保证对于每个字符串,满足上述条件,一行输入,以换行符结束。保证式子的表达式语义正确。特别的,一切数值计算均受限于模 \(65536\) 的数域,即每一步运算都要对 \(65536\) 取模,取模的规则同C语言规范。同时,任意数的 \(0\) 次方等于 \(1\) 。
输出描述
T行,T个整数。
每行输出对应案例表达式运算的结果,如遇到除以0的算数错误,请输出ArithmeticException。
示例1
输入
1
4*3/2^0+9
输出
21
说明
优先计算2!=2,之后以前一步的结果继续计算2!=2遇到换行符结束运算并输出
示例2
输入
2
2!!
3/2^4^4
输出
2
ArithmeticException
说明
优先计算 2 ^ 4 ^ 4 ,由于其结果对 \(65536\) 取模为 \(0\) ,因此下一步运算变成 \(3/0\) 从而产生ArithmeticException
备注
建议使用C/C++解答本题。
题解
思路
知识点:分治。
按优先级给符号分类,记录每类符号最后一个出现的地方位置,随后找到优先级最低且符号位置存在的位置划分表达式为左右两边,对他们进行相同的操作,然后根据返回表达式值以及对应符号处理得到结果再返回到上一层。
在这里我们没有处理负号,看似无法划分左右,但实际上还是可以的。比如, \(-4\) 可以划分成空区间(左右端点越界)以及 \(4\) ,前者由于符号位置都不存在直接进入 \(StoI\) 函数,由于左右端点越界直接返回 \(0\) ;后者会被转换成 \(4\) ,最后就是 \(0-4=-4\) 成立。
乘方用快速幂,关于除法非法可以设置全局变量 \(flag\) 检验。
注意这道题阶乘打表不然超时,注意乘法可能过程越界。
时间复杂度 平均:\(O(nlogn)\) 最差: \(O(n^2)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 65536;
int f[mod + 7];
string s;
bool flag;
void fact(int n) {
f[0] = 1;
for (int i = 1;i <= n;i++) f[i] = f[i - 1] * i % mod;
}
int StoI(int l, int r) {
int ans = 0;
for (int i = l;i <= r;i++) ans = (ans * 10 + s[i] - '0') % mod;
return ans;
}
int qpow(int a, int k) {
int ans = 1;
while (k) {
if (k & 1) ans = 1LL * ans * a % mod;
k >>= 1;
a = 1LL * a * a % mod;
}
return ans;
}
int calc(int l, int r) {
int pos[4] = { -1,-1,-1,-1 };///+-,*/,^,!
for (int i = l;i <= r;i++) {///最后运算符号判断(无括号)
if (s[i] == '+' || s[i] == '-') pos[0] = i;
else if (s[i] == '*' || s[i] == '/') pos[1] = i;
else if (s[i] == '^') pos[2] = i;
else if (s[i] == '!') pos[3] = i;
}
if (!~pos[0] && !~pos[1] && !~pos[2] && !~pos[3]) return StoI(l, r);///纯数判断(无括号)
else if (~pos[0]) {
if (s[pos[0]] == '+') return (calc(l, pos[0] - 1) + calc(pos[0] + 1, r)) % mod;
else if (s[pos[0]] == '-') return (calc(l, pos[0] - 1) - calc(pos[0] + 1, r) + mod) % mod;
}
else if (~pos[1]) {
int lans = calc(l, pos[1] - 1);
int rans = calc(pos[1] + 1, r);
if (s[pos[1]] == '*') return 1LL * lans * rans % mod;
else if (s[pos[1]] == '/') {
if (rans) return lans / rans;
else flag = 0;
}
}
else if (~pos[2]) {
if (s[pos[2]] == '^') return qpow(calc(l, pos[2] - 1), calc(pos[2] + 1, r));
}
else if (~pos[3]) {
if (s[pos[3]] == '!') return f[calc(l, pos[3] - 1)];
}
return 0;///过编译
}
bool solve() {
flag = 1;
cin >> s;
int ans = calc(0, s.length() - 1);
if (flag) cout << ans << '\n';
else return false;
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
fact(mod - 1);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << "ArithmeticException" << '\n';
}
return 0;
}
NC21181 重返小学的更多相关文章
- [下载]北京新版小学英语五年级上册mp3点读APP
义务教育教科书小学英语五年级上册点读软件.根据2014年北京教改版教材编写,发音标准.实现点读功能.点到哪里读到哪里.哪里不会点哪里!北京教育科学研究院编写,北京出版社出版.ISBN:97872001 ...
- [Android下载]北京新版小学英语三年级上册点读手机软件
小学英语三年级上册点读软件.根据2014年北京教改版教材编写,发音标准.实现点读功能.点到哪里读到哪里.哪里不会点哪里!北京教育科学研究院编写,北京出版社出版.ISBN:9787200108781 ...
- 用C语言编写生成小学四则运算程序
使用软件——VS 2015 使用环境——C语言 早在上周我就开始使用C#语言做,由于最后一点问题而放弃,之后用C语言开始做,很顺利,但是也碰到了一些问题,但是通过了百度文库上的一些程序的借鉴和吴阿平同 ...
- 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序
1. 编写一个能自动生成小学四则运算题目的程序.(10分) 基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图. 本题发一篇随笔,内容包括: 题 ...
- Hadoop阅读笔记(五)——重返Hadoop目录结构
常言道:男人是视觉动物.我觉得不完全对,我的理解是范围再扩大点,不管男人女人都是视觉动物.某些场合(比如面试.初次见面等),别人没有那么多的闲暇时间听你诉说过往以塑立一个关于你的完整模型.所以,第一眼 ...
- 近几日小学flare3d,
前言: Adobe虽然前2年砍掉了移动版flash player,以致H5大有可为, PC和移动端的2D世界不断被H5占领 不过FLASH已在3D方面,扩展出了新天地 FLARE 3D是 网页3D的新 ...
- sdut 2445 小学数学
小学数学 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdutoj/p ...
- McAfee重返科技业 研制D-Central防政府监视
新闻链接:http://tech.qq.com/a/20131008/016127.htm 新闻时间: 10月8日编译 新闻正文:McAfee重返科技业 研制D-Central防政府监视 约翰·迈克菲 ...
- NOI题库-小学奥赛QwQ
今天Loli教育我们让我们来看看NOI题库的奥赛部分,不过,为何是小学的( ⊙ o ⊙ )啊!感觉智商被各种侮辱. 余数相同问题: 描述 已知三个正整数 a,b,c. 现有一个大于1的整数x,将其作为 ...
随机推荐
- el-transfer增加拖拽功能
el-transfer增加拖拽排序,左右互相拖拽功能: npm i sortablejs <template> <el-transfer ref="transfer&quo ...
- Photoshop图片处理在线网页使用无需下载绿色
今天给大家推荐一个ps在线版网页 实测使用效果不错,绿色简介,无需下载,不卡顿一般的电脑配置都可以带起来 因为是在线的所以是精简版的,但是一般ps软件有的工具,功能他都有,比较适合及时性使用 废话不多 ...
- Quantexa CDI(场景决策智能)Syneo平台介绍
Quantexa 大数据服务提供商, 使用实体解析, 关系分析和人工智能技术帮助客户进行数据处理和预防金融犯罪. 企业概览 2016年成立, 当前规模500人 服务特色是场景决策智能CDI(conte ...
- R 数据可视化: PCA 主成分分析图
简介 主成分分析(Principal Component Analysis,PCA)是一种无监督的数据降维方法,通过主成分分析可以尽可能保留下具备区分性的低维数据特征.主成分分析图能帮助我们直观地感受 ...
- 《计算机组成原理/CSAPP》网课总结(一)
现在是2022年4月17日晚10点,本月计划的网课<csapp讲解>视频课看到了第八章"异常"第三讲,视频讲的很好但更新很慢,暂时没有最新的讲解,所以先做一个简单总结. ...
- 完全卸载nginx的详细步骤
一个执着于技术的公众号 前言 在开局配置Nginx时有可能会配置错误,报各种错误代码.看不懂或者懒得去看这个报错时,其实最简单的方式是卸载并重装咯.今天就带大家一起学习下,如何彻底卸载nginx程序. ...
- 干货 | LVM快照学习
一个执着于技术的公众号 前言 在上一章节,我们学习了LVM逻辑卷管理技术,知道了LVM能够通过增减PE的数量来弹性调整文件系统的大小.除此之外,LVM还有另一个重要功能「LVM快照技术」,也就是可以给 ...
- 干货 | 一文彻底读懂nginx中的location指令
一个执着于技术的公众号 Nginx系列导读 给小白的 Nginx 10分钟入门指南 Nginx编译安装及常用命令 完全卸载nginx的详细步骤 Nginx 配置文件详解 一文带你读懂Nginx反向代理 ...
- .NET混合开发解决方案8 WinForm程序中通过设置固定版本运行时的BrowserExecutableFolder属性集成WebView2控件
系列目录 [已更新最新开发文章,点击查看详细] 在我的博客<.NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件>中介绍了WinForm ...
- 【mq】从零开始实现 mq-08-配置优化 fluent
前景回顾 [mq]从零开始实现 mq-01-生产者.消费者启动 [mq]从零开始实现 mq-02-如何实现生产者调用消费者? [mq]从零开始实现 mq-03-引入 broker 中间人 [mq]从零 ...