yutasの競技プログラミング勉強帖

競技プログラミングの問題についての解説記事を主に書いています。

A - メダル / 第13回 アルゴリズム実技検定 (PAST13)

問題

高橋君は  n 円持ってゲームセンターにいる。

ゲームセンターでは「  x 円払って  y 枚のメダルを買う」ことが何回でもできるとき、高橋君の持つことのできるメダルの最大数を求めよ。

入力

1行に渡り、整数  n, x, y の順で与えられる。

条件

  •  1 \leq n \leq {10}^{12}
  •  1 \leq x, y \leq {10}^{6}

出力

答えとなる整数を1行で出力すること。

解法

メダル交換には必ず  x 円が必要なことから、高橋君がメダル交換できる回数の最大値は \begin{align} \left\lfloor \frac{n}{x} \right\rfloor \end{align} で与えられます。 (ただし、 \lfloor \cdot \rfloor は整数への切り捨てを表します。)

従って、この回数だけメダルを交換すると、メダルの枚数の最大値を得られることになるので、求める最大値は \begin{align} \left\lfloor \frac{n}{x} \right\rfloor \cdot y \end{align} で与えられます。

 n の値の最大値が  {10}^{12} であるので、C++int 型で扱うとオーバーフローを起こす可能性があることに注意が必要です。

ソースコード

main() 関数の中に、直接答えを出力する部分を実装しました。

int main() {
  ll n, x, y; // すべての整数を long long 型として扱う
  cin >> n >> x >> y; // 値の入力

  cout << (n / x) * y << endl; // 値の出力

  return 0;
}