https://atcoder.jp/contests/abc146/tasks/abc146_c
前提知識
解説
https://atcoder.jp/contests/abc146/submissions/8630477
x<yを満たすならばxの値段<yの値段を必ず満たす。
よって、所持金Xの境界線がどこにあるかを割り出せばいい。
これは二分探索を使おう。
check(x) := xを買うときの値段
これがX以下ならok, Xより大きいならngとして境界を詰めていく。
ll A, B, X; //--------------------------------------------------------------------------------------------------- ll check(ll x) { ll dx = to_string(x).length(); return A * x + B * dx; } //--------------------------------------------------------------------------------------------------- void _main() { cin >> A >> B >> X; ll ok = 0, ng = 1000000001; while (ok + 1 != ng) { ll md = (ok + ng) / 2; if (check(md) <= X) ok = md; else ng = md; } cout << ok << endl; }