专栏文章
CF2109C2 Hacking Numbers (Medium Version) 解题报告
CF2109C2题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip8ysaa
- 此快照首次捕获于
- 2025/12/03 08:06 3 个月前
- 此快照最后确认于
- 2025/12/03 08:06 3 个月前
题目大意
交互题。 组数据,每组给定一个整数 ,评测机中有一个隐藏的整数 。你可以对这个隐藏的 做出以下四种操作若干次(这里 C2 这道题要求最多 次)将隐藏的 变成 。
add y表示将 增加 ;mul y表示将 乘上 ;div y表示将 除以 ;digit表示将 的十进制各位数字相加,赋值给 ;
在以上的四种操作中,如果假设 操作后得到的数为 ,那么当且仅当 且 为整数时此次操作有效,交互机会返回 ,否则这次操作无效, 不做改变,交互机返回 。
在确定 时给交互机一个指令
! 结束这组数据,这时交互机会返回一个值 (正确)或者 (错误)。解题思路
一种思路为可以将 经过若干次操作后使得 变成我们可以确定的数,然后再经过最多一次操作使得 变为 。这里我们需要保留最后一次将 由我们已知的数字变为 的过程,那么题意就变成了:最多 次操作使得 变成一个确定的数。
如何去选取这个确定的数呢?在 C1 中我们选取数字 作为这个数字,但是缩小范围的过程过于繁琐,可不可以将这个数缩小成一个更大一点的确定的数呢?这里就需要用到我们小学数学中学到的一个结论:任何能被 整除的数,其十进制各位数字之和为 的倍数。该定理过于简单,这里不做证明。这里我们对 先乘一个 ,在去观察是否能够通过两次操作使得 变成 。即:
mul 9得到 ;digit得到 且由结论得 。至于这里为什么还是 ,我们很容易想到这里能取到的最大的数字 ,它的各位之和是 ,所以可以写出 ,但是由于 ,自然引出结论 ;- 考虑 到 之间的所有 的倍数,它的各位之和为 。于是再进行一次
digit操作得到 。
最后进行一次操作
add n-9 即可得到数字 。这里还是有一个细节就是当 时这一步操作不合法,所以需要特判一下。单次时间复杂度 。
不要忘记每次输出后清空缓存区哦。
AC Code
这里只放主函数
CPPsigned 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;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...