CF1103B Game with modulo 做题记录

未知一个数 aa,让你每次猜两个数 xxyy,若 (xmoda)(ymoda)(x\bmod a)\ge (y\bmod a) 返回 x,否则返回 y。让你猜测次数少于 6060 次的时候猜出数 aa

1a1091\le a\le 10^9

首先若 xax\le axmoda2xmodax\operatorname{mod} a\ge 2x\operatorname{mod} a,那么显然 xa2xx\le a\le2x

那么若找到了一个这样的 xx,就可以在 [x,2x][x,2x] 中二分 aa,若 midmoda2midmodamid\operatorname{mod} a\ge 2mid\operatorname{mod} a 则记下答案向上二分,否则向下二分。

考虑怎么找出这样的 xx,考虑倍增,从 x=1x=1 开始,若 xmoda<2xmodax\operatorname{mod} a< 2x\operatorname{mod} a,那么让 x2xx\to 2x,直到找到满足条件的 xx 为止。

倍增最多 3030 次,二分最多 2929 次。