1. 程式人生 > 其它 >CF1103B Game with modulo

CF1103B Game with modulo

題目大意

未知一個數 \(a\),讓你每次猜兩個數 \(x\)\(y\),若 \((x\bmod a)\ge (y\bmod a)\) 返回 x,否則返回 y

讓你猜測次數少於 \(60\) 次的時候猜出數 \(a\)

解題思路

我們可以先二分猜一個 \(x\),如果 \((2x\bmod a) ≥ (x \bmod a)\) , 那麼我們就能確定 \(x <= a <= 2x\)

找到 \(a\) 的範圍後,可以再來一個二分求出 \(a\)

具體見程式碼。

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;
}

本文來自部落格園,作者:蒟蒻orz,轉載請註明原文連結:https://www.cnblogs.com/orzz/p/15614723.html