はまやんはまやんはまやん

hamayanhamayan's blog

Buy an Integer [AtCoder Beginner Contest 146 C]

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