#4560. C1. Hacking Numbers (Easy Version)

C1. Hacking Numbers (Easy Version)

当前没有测试数据。

C1. Hacking Numbers (Easy Version)

时间限制 内存限制 输入 输出
2 秒 256 MB 标准输入 标准输出

题目描述

这是该问题的简单版本。在这个版本中,你最多可以发送 7\mathbf{7} 条命令。只有解决了该问题的所有版本,你才能进行 Hack 操作。

这是一道交互式题目。

欢迎你,决斗者!在这个交互式挑战中,存在一个未知整数 xx1x1091 \le x \le 10^9)。你需要将它变为输入中给定的整数 nn。通过驾驭「数学机甲」怪兽的力量,你可以发送以下命令之一:

命令 约束条件 计算结果 判定条件 数值更新 裁判的响应
"add yy" 1018y1018-10^{18} \le y \le 10^{18} res=x+y\mathrm{res} = x + y 1res10181 \le \mathrm{res} \le 10^{18} xresx \leftarrow \mathrm{res} "1"
否则 xxx \leftarrow x "0"
"mul yy" 1y10181 \le y \le 10^{18} res=xy\mathrm{res} = x \cdot y 1res10181 \le \mathrm{res} \le 10^{18} xresx \leftarrow \mathrm{res} "1"
否则 xxx \leftarrow x "0"
"div yy" 1y10181 \le y \le 10^{18} res=x/y\mathrm{res} = x/y yy 整除 xx xresx \leftarrow \mathrm{res} "1"
否则 xxx \leftarrow x "0"
"digit" res=S(x)\mathrm{res} = S(x)^{\text{∗}} xresx \leftarrow \mathrm{res} "1"

你需要使用至多 7\mathbf{7} 条命令将 xx 变为 nn

^{\text{∗}}S(n)S(n) 是一个函数,返回非负整数 nn 的所有数位上的数字之和。例如,S(123)=1+2+3=6S(123) = 1 + 2 + 3 = 6

输入格式

输入包含多组测试用例。第一行输入测试用例的数量 tt1t50001 \le t \le 5000)。每组测试用例的描述如下:

每组测试用例仅包含一行,输入一个整数 nn1n1091 \le n \le 10^9)。

交互方式

每组测试用例的交互过程从读取整数 nn 开始。

要发送命令,你需要按以下格式输出一行内容:

  • "add $y$":将 xx 加上整数 yy1018y1018-10^{18} \le y \le 10^{18})。 若 x+yx + y 落在区间 [1,1018][1, 10^{18}] 内,裁判会输出 "1"(命令执行成功);否则输出 "0"(命令执行失败)。执行成功时更新 xx+yx \leftarrow x + y,否则 xx 保持不变。

  • "mul $y$":将 xx 乘以正整数 yy1y10181 \le y \le 10^{18})。 若 xyx \cdot y 落在区间 [1,1018][1, 10^{18}] 内,裁判会输出 "1"(命令执行成功);否则输出 "0"(命令执行失败)。执行成功时更新 xxyx \leftarrow x \cdot y,否则 xx 保持不变。

  • "div $y$":将 xx 除以正整数 yy1y10181 \le y \le 10^{18})。 若 yy 能整除 xx,裁判会输出 "1"(命令执行成功);否则输出 "0"(命令执行失败)。执行成功时更新 xxyx \leftarrow \frac{x}{y},否则 xx 保持不变。

  • "digit":将 xx 变为其所有数位上的数字之和。 裁判总会输出 "1",并更新 xS(x)x \leftarrow S(x)

重要注意事项

  1. 命令是大小写敏感的(例如 "Add 1" 是无效命令)。
  2. 当你确定 xx 等于 nn 时,输出 "!"
    • 裁判会输出 "1" 表示 x=nx = n,输出 "-1" 表示 xnx \neq n
    • 输出 "!" 不计入最多 7 条命令的限制。
  3. 若单个测试用例发送超过 7 条命令,或发送无效命令,该命令的响应会是 "-1"。收到该响应后,程序需立即终止,否则会被判为错误答案(Wrong Answer)。
  4. 输出每条命令后,必须输出换行符并刷新输出缓冲区(否则会触发 Idleness limit exceeded 错误):
    • C++:fflush(stdout)cout.flush()
    • Java:System.out.flush()
    • Python:sys.stdout.flush()
    • Rust:std::io::stdout().flush()
    • 其他语言请参考对应文档。
  5. 交互器是非自适应的:未知整数 xx 仅会因你的合法命令更新,不会主动改变。

Hack 格式

若要进行 Hack,需按照以下格式构造输入:

第一行输入整数 tt1t50001 \le t \le 5000),表示测试用例数量。

每组测试用例的第一行输入两个正整数 nnxx1n,x1091 \le n,x \le 10^9),分别表示目标值和初始的未知整数。

样例交互过程

裁判侧输入(Hack 格式)

2
100 9
5 1234

程序侧输出

add -10
add 1
mul 10
!
digit
div 2
!

裁判侧响应

0
1
1
1
1
1
1

样例解释

交互阶段 程序输出 裁判响应 详细说明
初始化 - 2 共 2 组测试用例
第一组测试用例 - 目标值 n=100n=100,初始未知整数 x=9x=9
命令 1 add -10 0 9+(10)=109 + (-10) = -1 \le 0,命令失败,xx 仍为 9
命令 2 add 1 1 9+1=10[1,1018]9 + 1 = 10 \in [1, 10^{18}],命令成功,x=10x=10
命令 3 mul 10 10×10=100[1,1018]10 \times 10 = 100 \in [1, 10^{18}],命令成功,x=100x=100
确认 ! x=100=nx=100 = n,判定正确
第二组测试用例 - 目标值 n=5n=5,初始未知整数 x=1234x=1234
命令 1 digit 1 数位和 1+2+3+4=101+2+3+4=10,命令成功,x=10x=10
命令 2 div 2 2 整除 10,命令成功,x=5x=5
确认 ! x=5=nx=5 = n,判定正确

:样例中的空行仅为便于理解,实际交互过程中不会出现空行。