思路:
他想知道自己是否可以赢取尽量多的数量的硬币。即他要采取措施让自己的硬币在任何情况下(不会连输超过x次)都要不断增多。
即我们考虑第一次,第二次,,,第x次,每一次都有赢和输的两种可能,每一次要赌多少硬币呢?我们不管这一次输多少,但是要保证这一次如果赢的话,要使硬币量大于原始的a,用二分判断出这一次最少要赌的硬币量,如果这一次输了就进入下一次,一共不会超过x次。
代码:
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;
typedef pair<int, int> PII;
typedef pair<PII, int> PIII;
const int inf = 0x3f3f3f3f;
const ll infinf = 0x3f3f3f3f3f3f3f3f;
//const int N =
void solve() {
ll k, x, a; cin >> k >> x >> a;
ll tmp = a;
for (ll i = 1; i <= x; i ++) {
ll l = 1, r = a;
while (l < r) {
ll mid = (l + r) / 2;
if (a - mid + k * mid > tmp) r = mid;
else l = mid + 1;
}
if (a <= l) { // 如果剩下的硬币不够了, 输出NO
cout << "NO" << endl;
return;
}
else {
a -= l; // 输掉, 进入下一轮
if (i == x) { // 最后一轮, 则下一次必赢, 直接将剩下的硬币全赌进去, 得 k * a个
a *= k;
if (a > tmp) cout << "YES" << endl; // 如果硬币量大于原始的a, 则YES
else cout << "NO" << endl;
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t; cin >> t;
while (t --) solve();
return 0;
}