CF2109C2 Hacking Numbers (Medium Version) 解题报告
题目传送门
题目大意
交互题。
add y表示将x 增加y(-10^{18}\le y\le 10^{18}) ;mul y表示将x 乘上y(1\le y\le 10^{18}) ;div y表示将x 除以y(1\le y\le 10^{18}) ;digit表示将x 的十进制各位数字相加,赋值给x ;
在以上的四种操作中,如果假设
在确定 ! 结束这组数据,这时交互机会返回一个值
解题思路
一种思路为可以将
如何去选取这个确定的数呢?在 C1 中我们选取数字
mul 9得到1\le x\le 10^9\to 9\le x\le 9\times10^9 ;digit得到9\le x\le 9\times 10^9\to 9\le x\le 81 且由结论得9\mid x 。至于这里为什么还是81 ,我们很容易想到这里能取到的最大的数字8999999999 ,它的各位之和是89 ,所以可以写出1\le x\le 89 ,但是由于9\mid x ,自然引出结论9\le x\le 81 ;- 考虑
9 到81 之间的所有9 的倍数,它的各位之和为9 。于是再进行一次digit操作得到9\le x\le 81\to x=9 。
最后进行一次操作 add n-9 即可得到数字
单次时间复杂度
不要忘记每次输出后清空缓存区哦。
AC Code
这里只放主函数
signed main()
{
int T=re();
while(T--)
{
int n=re();
puts("mul 9");
cout.flush();
int op=re();
puts("digit");
cout.flush();
op=re();
puts("digit");
cout.flush();
op=re();
if(n!=9)
{
printf("add %d\n",n-9);
cout.flush();
op=re();
}
puts("!");
cout.flush();
op=re();
}
return 0;
}