CF1103B Game with modulo

题目大意

未知一个数 aa,让你每次猜两个数 xxyy,若 (xmoda)(ymoda)(x\bmod a)\ge (y\bmod a) 返回 x,否则返回 y

让你猜测次数少于 6060 次的时候猜出数 aa

解题思路

我们可以先二分猜一个 xx,如果 (2xmoda)(xmoda)(2x\bmod a) ≥ (x \bmod a) , 那么我们就能确定 xa2xx \leq a \leq 2x

找到 aa 的范围后,可以再来一个二分求出 aa

具体见代码。

CODE

#include <bits/stdc++.h>

#define int long long

using namespace std;

string s;

int len;

signed main()
{
    cin >> s;
    while (s.size() != 3 && s.size() != 7)
    {
        int l = 0, r = 1;
        do
        {
            printf("? %lld %lld\n", l, r);
            cin >> s;
            if (s[0] == 'y')
            {
                l = r;
                r <<= 1;
            }
        } while (s[0] == 'y');
        while (l + 1 < r)
        {
            int mid = (l + r) >> 1;
            printf("? %lld %lld\n", mid, l);
            cin >> s;
            if (s[0] == 'x')
                l = mid;
            else
                r = mid;
        }
        printf("! %lld\n", l + 1);
        cin >> s;
    }
    return 0;
}
posted @ 2021-11-27 00:08  蒟蒻orz  阅读(0)  评论(0编辑  收藏  举报  来源