在 2111 年,第 128 届全国青少年信息学奥林匹克冬令营前夕,Z君找到了 2015 年,第 32 届冬令营的题目来练习。
他打开了第三题 “未来程序” 这道题目:
“本题是一道提交答案题,一共 10 个测试点。
对于每个测试点,你会得到一段程序的源代码和这段程序的输入。你要运行这个程序,并保存这个程序的输出。
遗憾的是这些程序都效率极其低下,无法在比赛的 5 个小时内得到输出。”
Z君想了一下,决定用 2111 年的计算机来试着运行这个题目,但是问题来了,Z君已经找不到96年前的那次比赛的测试数据了……
没有给出输入数据的提交答案题就不成其“提交答案题”之名,为了解决这个问题,Z君决定将这个题目改造成传统题。
Z君知道96年前的计算机的性能比现在差多了,所以这道题的测试数据中,输入数据的规模被设计成很小,从而,做这道题的选手只需要暴力模拟源代码的工作流程就可以通过它。
现在这道题摆到了你的面前。
本题是一道传统题,一共有 10 个测试点。
对于每个测试点,你的程序会得到一段程序的源代码和这段程序的输入。你的程序需要运行这段程序,并输出这段程序的输出。
关于给出的源代码的约定
Z君是一名C++选手。为了简化这个问题,Z君在给出的源代码中去掉了C++语言的大量特性。从而这个源代码具有以下特点:
第一行必定为 #include<iostream>
>> 这个库中只会调用到对象cin, cout、endl,cin的>>(int)方法和cout的<<(int)方法。这两个方法的返回值为cin和cout。
第二行必定为 #include<cstdio>
>> 这个库中只会调用到putchar方法。putchar方法的返回值为其唯一参数。
第三行必定为 using namespace std;
>> 对象cin的调用不再需要透过std::cin进行,cout和endl同理。
int main() 没有任何参数
所有的变量都是int或int数组(含高维数组)类型
>> 对象cin, cout,endl是例外,注意putchar的参数也是int类型的。我们保证在运行时这个参数的值在0~127中。
>> 在运行时,不会出现数组越界问题。
>> 没有维度的范围为1。也即,不会出现int a[1][1][1][1][1]...这样的情况。
>> 维度的范围直接由十进制常量给出。也即,不会出现int a[(100+100)*2]这样的情况。
所有的函数都是int类型,函数的参数只可能是int类型
>> 注意函数的返回值可以被丢弃。
>> 当没有显式地返回值时,返回0。
bool型被认为是一种特殊的int型
>> ==在两个参数相同时返回1,否则返回0。
>> !=在两个参数相同时返回0,否则返回1。
>> <在第一个参数小于第二个参数时返回1,否则返回0。
>> <=在第一个参数小于等于第二个参数时返回1,否则返回0。
>> >在第一个参数大于第二个参数时返回1,否则返回0。
>> >=在第一个参数大于等于第二个参数时返回1,否则返回0。
>> &&在两个参数都不为0时返回1,否则返回0。
>> ||在两个参数都为0时返回0,否则返回1。
>> ^在两个参数中只有一个为0时返回1,其他时候返回0。
>> !在参数为0时返回1,否则返回0。
>> 由于bool型被int型取代了,因此所有的表达式都应该被完全计算:例如在表达式(a && (b = c))中,即使a已经被确定是0,仍然需要计算(b = c)的值,尽管无论(b = c)的值如何,整个表达式的值都是0。
可能用到的运算符及其优先级如下:
>> (最高)(), [];
>> !, [单目]+, [单目]-;
>> *, /, %;
>> +, -;
>> <=, >=, <, >;
>> ==, !=;
>> ^;
>> &&;
>> ||;
>> =;(只有这级运算符是右结合的)
>> (最低)cout的<<与cin的>>。
所有int常量以十进制形式给出
Z君没有对源代码进行混淆,所以源代码是可读的,你不必担心出现大量嵌套的花括号或此类的“垃圾代码”
运行时使用的变量占用的空间的峰值不超过8MB。也即,2^21个int
调用函数的深度不会超过10^3层
可能出现连续赋值,例如a = (b = (c = 3) + 2) % c
>> 之前对c的赋值将会反映到之后对c的引用上
>> 赋值的返回值为赋值以后的值。
可能出现的程序流程控制语句:
>> if (statement) statement [else statement]
>> while (statement) statement
>> for ([statement]; [statement]; [statement]) statement
>> 那些作为条件的statement的返回值应当被视为bool型的。具体的来说,若返回值为0,则为false,若返回值非0,则为true。在for循环中,当第二个[statement]取空时,视为true。
空白字符只有新行符(包括\n和\r)和空格
声明变量时默认初始值为0,声明变量的同时不会进行赋值。
没有注释
所有的右花括号后没有分号
没有用来连接语句的逗号
没有函数和变量重名