Description
题目链接:Codeforces 1104D
这是一道交互题。
Vasya 和 Petya 在玩一个游戏:Petya 有一个正整数 $a$,Vasya 可以询问若干对非负整数 $(x,y)$,对于每次询问,Petya 会回答他:
x
:如果满足 $x\bmod a\ge y\bmod a$。y
:如果满足 $x\bmod a<y\bmod a$。
Vasya 可以询问不超过 $60$ 对数字,保证 $1\le a\le 10^9$。
本题有 $T$ 组数据。
数据范围:$1\le a\le 10^9$,$1\le T\le 100$
Solution
我们考虑以 $(0,1),(1,2),(2,4),(4,8),\dots,(2^{29},2^{30})$ 这样的方式询问。
显然这样的询问方式中,一定存在 $(l,r)$ 满足 $l<a\le r$。由于 $r=2l<2a$,那么 $l\bmod a\ge r\bmod a$;这意味着 $(l,r)$ 是第一对满足 $x\bmod a\ge y\bmod a$ 的数对 $(x,y)$。
当我们确定了 $(l,r)$,那么我们就确定了 $a$ 的范围 $a\in(l,r]$。于是我们就可以二分 $a$ 的值 $x$。通过询问 $(l,a)$ 很容易得到 $a$ 的值。
最后,我们考虑特殊情况:$a=1$ 或 $a=2$。
- 当 $a=1$ 时,任何数 $\bmod 1$ 的答案都是 $0$。那么所有的询问对应的答案都应该是
x
,特判即可。 - 当 $a=2$ 时,除了第一组询问答案是
y
,其余询问的答案都是x
,特判即可。
时间复杂度:$O(T\log a)$
Code
1 |
|