問題
問題文
高橋君は青と赤の $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 型にする必要があります。
# 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と同じ方針でした。
リンク
前後の記事
- 前の記事 → AtCoderログ:0123 - ABC 153 D