0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AtCoderログ:0124 - ABC 158 B

Posted at

問題

問題文

高橋君は青と赤の $2$ 色のボールを持っており、これらを一列に並べようとしています。
初め、列にボールはありません。
根気のある高橋君は、次の操作を $10^{100}$ 回繰り返します。
・列の末尾に、$A$ 個の青いボールを加える。その後、列の末尾に $B$ 個の赤いボールを加える。
こうしてできる列の先頭から $N$ 個のボールのうち、青いボールの個数はいくつでしょうか。

制約

・$1 \le N \le 10^{18}$
・$A,B \ge 0$
・$0 < A+B \le 10^{18}$
・入力は全て整数である

収録されている問題セット

回答

回答1 (AC)

$N$ 個のボールを先頭から見ると、青いボールが $A$ 個、赤いボールが $B$ 個、青いボールが $A$ 個、赤いボールが $B$ 個、... となっています。「青いボールが $A$ 個、赤いボールが $B$ 個」の組は n/(a+b) 組あり、残りは n%(a+b) 個です。
青いボールの個数は、「青いボールが $A$ 個、赤いボールが $B$ 個」の組に $A$ 個ずつと、残りの部分が $A$ 個より少なければその個数、そうでなければ $A$ 個あります。これらをまとめると以下のコードとなりました。$N$, $A$, $B$ を記憶する変数は long long 型にする必要があります。

abc158b-1.cpp
# include <bits/stdc++.h>
using namespace std;
 
int main() {
  int64_t n, a, b;
  cin >> n >> a >> b;
  
  int64_t answer = n/(a+b)*a, r = n%(a+b);
  if ( r<a ) {
    answer += r;
  } else {
    answer += a;
  }
  
  cout << answer << endl;
}

調べたこと

AtCoder の解説ユーザ解説

回答1と同じ方針でした。残りの部分の青いボールの個数を調べるには min 関数を使用するのが便利とのことでした。

AtCoder の解説コンテスト全体の解説

回答1と同じ方針でした。

リンク

前後の記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?