#A22. 【USTC新生赛2025】G. ICS
【USTC新生赛2025】G. ICS
题目背景
If you have ever suffered from the English textbook of ICS course in sophomore, and you are willing to translate the third edition of the textbook, we sincerely invite you to complete this tough task.
题目描述
这是一道交互题。
你拥有 个寄存器 ,每个寄存器记录一个范围是 的整数。你还拥有一个可以计算加法、减法、乘法和整除的变种 ALU。在这里,负数的整除定义为:先将负数转换为正数进行取余,再调整符号以匹配原数的正负。
这个变种 ALU 能帮助你使用唯一一种操作,该操作需要参数 ( 为一种运算,),并根据输入情况执行指令并返回结果:
- 返回
MathError:当且仅当 且 ,或 。在这种情况下,不执行任何操作。 - 返回
NoResponse:该操作会令 。
开始时,交互库会令 (),你需要用不超过 次操作,得到结果 并将结果存储在 中。
交互方式
当你需要进行操作时:
以 op x y z 的格式输出并清空缓冲区。
你需要保证 ,且目前询问次数不超过 次,否则交互库会出现未知错误。
之后,请输入一个字符串 表示该语句的运行情况。
当所有操作已经执行完后,输出 ! 并清空缓冲区,之后结束程序。
样例 #1
样例输入 #1
NoResponse
MathError
样例输出 #1
- 0 1 2
/ 1 2 3
!
提示
对于样例,假设 时:第一次操作 ,第二次操作 出现 ,此时 上为结果 结束程序。
如何清空缓冲区:
- 在 C 和 C++ 中,使用 (如果你使用 )或 (如果你使用 )。
- 在 Python 中,使用 。
- 特别地,在 C++ 中,使用 会自动清空缓冲区。
如果你仍然对于交互题有疑问,下面会展示一份样例代码:
#include<stdio.h>
#include<string.h>
char s[11];
int main(){
while(1){
printf("/ 0 1 2\n"); fflush(stdout);
scanf("%s", s);
if(strlen(s) == 9) break; //only strlen("MathError")=9
printf("- 1 0 1\n"); fflush(stdout);
scanf("%s", s);
if(strlen(s) == 9) break;
}
printf("!\n"); fflush(stdout);
return 0;
}
该代码会在 时,获得正确的结果(不一定在正确的操作次数内);否则将会出现未知错误。