[CF1103B]Game with modulo

题目大意:交互题,有一个数$a(aleqslant10^9)$,需要猜出它的值,一次询问为你两个数字$x,y(x,yin[0,2 imes10^9])$:

  1. 若$xmod ageqslant ymod a$,返回字符$x$
  2. 若$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;
}

  

原文地址:https://www.cnblogs.com/Memory-of-winter/p/10351602.html