130 lines
4.2 KiB
Python
130 lines
4.2 KiB
Python
#!/usr/bin/env python3
|
||
import sys
|
||
|
||
def solve():
|
||
n = int(input())
|
||
|
||
# 基于示例的策略分析:
|
||
# 示例1: 目标100, x未知 -> add -10(失败) -> add 1(成功) -> mul 10(成功) -> 结果100
|
||
# 示例2: 目标5, x未知 -> digit(成功) -> div 2(成功) -> 结果5
|
||
|
||
# 观察:我们需要一个能处理任意初始值的通用策略
|
||
|
||
# 通用策略:
|
||
# 1. 先用digit将值标准化到较小范围
|
||
# 2. 然后用算术操作构造目标
|
||
|
||
# 第一步:标准化
|
||
print("digit")
|
||
sys.stdout.flush()
|
||
response = int(input())
|
||
|
||
if response != 1:
|
||
return
|
||
|
||
# 现在值在某个较小的范围内(但可能不是1-9,因为digit可能需要多次)
|
||
|
||
# 第二步:构造目标
|
||
if n <= 9:
|
||
# 对于单位数目标,尝试多种调整策略
|
||
success = False
|
||
|
||
# 策略1:尝试各种可能的当前值,调整到n
|
||
for possible_current in range(1, 100): # 扩大搜索范围
|
||
if success:
|
||
break
|
||
|
||
# 计算需要的调整
|
||
diff = n - possible_current
|
||
|
||
# 尝试加法调整
|
||
if abs(diff) <= 10**18:
|
||
print(f"add {diff}")
|
||
sys.stdout.flush()
|
||
response = int(input())
|
||
if response == 1:
|
||
success = True
|
||
break
|
||
|
||
# 策略2:如果加法失败,尝试除法(如示例2)
|
||
if not success and n < 10:
|
||
for divisor in range(2, 20):
|
||
print(f"div {divisor}")
|
||
sys.stdout.flush()
|
||
response = int(input())
|
||
if response == 1:
|
||
# 除法成功,可能需要继续调整
|
||
for adj in range(-10, 11):
|
||
if adj == 0:
|
||
continue
|
||
print(f"add {adj}")
|
||
sys.stdout.flush()
|
||
response = int(input())
|
||
if response == 1:
|
||
success = True
|
||
break
|
||
break
|
||
|
||
else:
|
||
# 对于大数目标,使用乘法+加法组合
|
||
success = False
|
||
|
||
# 策略1:找到合适的因数分解 n = a * b
|
||
for a in range(1, min(100, n+1)):
|
||
if success:
|
||
break
|
||
|
||
if n % a == 0:
|
||
b = n // a
|
||
if b <= 10**18:
|
||
# 尝试构造 a,然后乘以 b
|
||
|
||
# 首先尝试调整到 a
|
||
for current_guess in range(1, 100):
|
||
diff = a - current_guess
|
||
print(f"add {diff}")
|
||
sys.stdout.flush()
|
||
response = int(input())
|
||
|
||
if response == 1:
|
||
# 成功调整到 a,现在乘以 b
|
||
print(f"mul {b}")
|
||
sys.stdout.flush()
|
||
response = int(input())
|
||
if response == 1:
|
||
success = True
|
||
break
|
||
else:
|
||
# 乘法失败,尝试下一个分解
|
||
break
|
||
|
||
# 如果这个调整失败,尝试下一个current_guess
|
||
|
||
if success:
|
||
break
|
||
|
||
# 策略2:如果因数分解失败,尝试直接构造
|
||
if not success:
|
||
for current_guess in range(1, 100):
|
||
diff = n - current_guess
|
||
if abs(diff) <= 10**18:
|
||
print(f"add {diff}")
|
||
sys.stdout.flush()
|
||
response = int(input())
|
||
if response == 1:
|
||
success = True
|
||
break
|
||
|
||
# 输出结果
|
||
print("!")
|
||
sys.stdout.flush()
|
||
final_response = int(input())
|
||
|
||
def main():
|
||
t = int(input())
|
||
for _ in range(t):
|
||
solve()
|
||
|
||
if __name__ == "__main__":
|
||
main()
|