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

hamayanhamayan's blog

200th ABC-200 [京セラプログラミングコンテスト2021(AtCoder Beginner Contest 200)B]

https://atcoder.jp/contests/abc200/tasks/abc200_b

解説

https://atcoder.jp/contests/abc200/submissions/22435193

問題では一部文字列として計算しているが、普通に数値計算できるので、数値計算としてやっていくのがオススメ。
ちなみに、文字列を経由しても、間に合う。

整数がNが200の倍数

普通に N /= 200をすればいい。

200を末尾に追加する

これは数値計算で考えると1000倍して+200することになる。
こうすることで数値計算ができる。

上限は?

数値計算時に気になるのが上限である。
2番目の操作前をxとすると、操作後は1000x+200となるが、これは200の倍数なので、
2番目の操作後は必ず1番目の操作を行う事になる。
すると5x+1になる。
単純に計算すると5倍されるような感じになって、この操作が最大10回行われるので、105*510が最大になりそうな数である。
これは976562500000なので、C++ならlong longなら収まるので問題ない。

int N, K;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N >> K;
    
    ll x = N;
    rep(_, 0, K) {
        if (x % 200 == 0) x /= 200;
        else x = x * 1000 + 200;
    }
    cout << x << endl;
}