AtCoder, ABC100: B. Ringo's Favorite Numbers

atcoder.jp

 100^D で割り切れるN番目に小さな数を求める.
 D \in {0, 1, 2} かつ  N \in [1, 100]なので,あらかじめ数列を作ってしまってもよい.

数列をAとすると,問題文のサンプルにもあるように

  •  D = 0 なら, A = [1, 2, 3, \dots]
  •  D = 1 なら, A = [100, 200, 300, \dots]
  •  D = 2 なら, A = [10000, 20000, 30000, \dots]

となる.
こう見てみると,数列の  k 番目の要素は  A_k = k \cdot 100^D で良さそうに見える.
しかし,  k \cdot 100^D の中には  100^D で割り切れる数が含まれる.
(例として, D=2かつ N=100 \rightarrow k=100のとき, A_k = k \cdot 100^D なら  A_{100} = 1000000 だが,これは 100 D+1回割り切れてしまう)
 100^D で割り切れてしまう場合は, A_{k+1} が答えとなる.

まとめると,

\begin{align}
A_k =
  \begin{cases}
    k \cdot 100^D~ \text{(if $k \cdot 100^D$ can be divided by exactly $D$ times}) \\
    (k+1) \cdot 100^D~ \text{(otherwise)}
  \end{cases}
\end{align}
となる.コードは↓の通り.

# include <cmath>
# include <iostream>
# define rep(i, n) for (int i = 0; i < (int)(n); i++)
using namespace std;

int main() {
    int d, n;
    cin >> d >> n;

    int base = pow(100, d);
    int ans = base * n;

    if ((ans / (int)pow(100, d)) % 100 == 0) {
        ans = base * (n+1);
    }
    cout << ans << endl;
    return 0;
}