题意简述
交互题,给定集合 和一个隐藏的数 ,你需要使用不超过 次操作猜出 ,操作类型如下:
A x
,查询在 中是 的倍数的数的个数。
B x
,查询在 中是 的倍数的数的个数,并把这些数删去,但是 不会被删去。
C x
,表示你猜的 。
。
分析
给出一个常数:, 指的是 的质数个数, 指的是 的质数。
考虑到每个 都可以写成唯一分解的形式 ,考虑枚举每一个 ,使用一次 B 操作删去 的所有倍数,然后查询此时 倍数个数。若为 ,那么 是 的其中一个质因子,暴力枚举每一个 使用 A 操作就能得到 在这个质因数下的具体指数。
但这样的询问次数是 ,不能通过。
考虑优化,一个很经典的套路是对质因子根号分治,设阈值 , 的质因子可以向之前那样暴力计算,而质数幂的数量大概在 量级,次数较小,可以承受。
而 至多有一个 的质因子,若 不为 或者 的质数,那么我们只需要对每个质因子使用 A 操作,若 包含某个质因子,那么在对这个质因子使用 A 操作返回的答案是 ,那么只需要 次操作就可以求出答案。
但如果 为 或者 的质数,无论对那个质因子操作返回的答案都是 ,这种情况下我们只能使用暴力方案求解,次数还是爆炸。
发现对每个质因子都使用 A 操作 check 太浪费了,考虑把多个质因子批量删除之后一起使用 A 操作 check。对质因子分块,设块长 ,考虑逐块查询,将块内质因子用 B 操作删掉后查询 A 1
,若返回的答案不为 剩余的质因子数+1,那么 落在这个块内,暴力 check 即可。次数为 ,可以通过。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步