题目大意:交互题,有一个数$a(aleqslant10^9)$,需要猜出它的值,一次询问为你两个数字$x,y(x,yin[0,2 imes10^9])$:
- 若$xmod ageqslant ymod a$,返回字符$x$
- 若$xmod a< ymod a$,返回字符$y$
你最多询问$60$次
题解:$60$,差不多是$2log_2n$。
令$x=ka+b(kinmathbb{N},0leqslant b<a)$,$2x=(2k+[2bgeqslant a])a+(2bmod a)$。若$xmod ageqslant2xmod a$,即$bgeqslant (2bmod a)$。当$k=0$时,$x<aleqslant2x$。
这样就有了$a$的一个范围,然后在这个区间内二分,这题似乎我以前的二分写法不可以,需要$ain[l,r]$时才有二分性,并且$mid ot=l$,不然询问返回都是$x$
卡点:翻译中没有$x,yin[0,2 imes10^9]$,导致我写了个简单一点的二分。发现后各种换二分方法。。。
C++ Code:
#include <cstdio> char op[20]; int main() { scanf("%s", op); while (*op == 's') { int l = 0, r = 1; while (true) { printf("? %d %d ", l, r); fflush(stdout), scanf("%s", op); if (*op == 'x') break; l = r, r <<= 1; } ++l; if (l != r) { while (l < r) { int mid = l + r >> 1; if (mid == l) ++mid; printf("%d %d ", l, r); printf("? %d %d ", mid, l); fflush(stdout), scanf("%s", op); if (*op == 'y') r = mid; else l = mid + 1; } } printf("! %d ", l); fflush(stdout), scanf("%s", op); } return 0; }