CF1103B Game with modulo
阿新 • • 發佈:2021-11-28
題目大意
未知一個數 \(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