站外题求助
  • 板块学术版
  • 楼主Zheng_Hongyi
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/9/24 22:13
  • 上次更新2023/11/2 18:13:39
查看原帖
站外题求助
779106
Zheng_Hongyi楼主2023/9/24 22:13

数据溢出 (overflow, 1s/256M)

数据溢出是程序员经常会遇到的 bug 之一。例如,32 位无符号整型的数据范围是 0∼232−10∼2^{32}-1而如果一个该类型的变量的取值超过了 232−12^{32}-1,那么就会导致数据溢出,使得程序运行出不可预料的结果。

所幸的是,在 GCC 版本的 C++ 编译器中,有这样一个可以帮助检查代码中所有 “未定义行为(Undefined Behaviour)” 的检查器(Sanitizer),而数据溢出就是一类未定义行为。如果编译的时候开启这个检查器,那么一旦程序运行的时候出现了未定义行为,那么程序就会返回一个 Runtime Error 的结果。

在本题中,你的任务就是实现检查器中有关数据溢出的部分。具体来说,假设某种无符号数据类型的数据范围是0∼M0∼M,然后接下来会给出某段程序其中一个变量的变化情况(该变量初始值为00),你需要判断该变量是否发生了数据溢出。

输入格式

第一行输入一个正整数TT,表示数据组数。

对于每一组数据,第一行输入两个正整数N,MN,M,分别表示变量变化次数和该数据类型的范围。 接下来NN行,每一行的输入都形如如下三种格式之一:

  • ++ x:表示该变量的值加上xx,即设变量的原值为AA,那么新值就是A+xA+x

  • ∗* x:表示该变量的值乘上xx,即设变量的原值为AA,那么新值就是A∗xA*x

  • / x:表示该变量的值除以xx并向下取整,即设变量的原值为AA,那么新值就是⌊A/xA/x⌋。其中⌊x⌋ 表示向下取整,例如 ⌊3.1⌋=3 ,⌊0.1⌋=0 ,⌊5⌋=5

注意:本题输入量较大,请使用速度较快的输入方式。

输出格式

对于每一组数据,输出一行一个正整数,表示其最早发生数据溢出的操作次数。如果没有发生数据溢出,则输出一行 Not Overflow。

样例输入

2
5 9999
+ 2
* 10
/ 2
* 1000
/ 1000
5 10000
+ 2
* 10
/ 2
* 1000
/ 1000

样例输出

4
Not Overflow

样例解释 第一组数据的第四步是给变量乘以 1000,之后得到的变量的值是 10000,超过了 9999,故发生了数据溢出。 数据范围

  • 对于 30% 的数据,1≤N≤10,1≤M≤2161 \le N \le 10 , 1 \le M \le 2^{16}

  • 对于 60% 的数据,1≤N≤1000,1≤M≤2321 \le N \le 1000 , 1 \le M\le 2^{32}

  • 对于 100% 的数据,1≤N≤105,0≤M<263,1≤T≤5,1≤x<M1 \le N \le 10^5 , 0\le M < 2^{63} , 1 \le T \le 5,1 \le x <M

数据保证不会除以 0。

2023/9/24 22:13
加载中...