这个数据范围和这个次数限制,很显然是个二分。
设f(x)= x % a,他的图像是这样的
是一个周期为a的函数,如果从0 1开始猜,每次翻倍,必然会有一次x,y包含a,此时会输出x,之后在x,y之间二分答案即可
string s;
void solve()
{
int x, y;
for (x = 0, y = 1;; x = y, y *= 2)
{
cout << '?' << " " << x << " " << y << endl;
cin >> s;
if (s == "x")
break;
}
while (x < y)
{
int mid = (x + y) >> 1;
cout << '?' << " " << mid << " " << y << endl;
fflush(stdout);
cin >> s;
if (mid + 1 == y)
{
cout << "! ";
if (s == "x")
cout << y << endl;
else
cout << mid << endl;
break;
}
if (s == "x") x = mid;
if (s == "y") y = mid;
}
}
signed main()
{
while (cin >> s) if (s[0] == 's') solve();
return 0;
}