これは難しいですね。何も考えずに for
文で求めるのが比較的楽でしょうか。
問題概要
と番号のついた 人に、 枚のカードを配っていく。
人 から始めて、人 の順に 1 枚ずつカードを配るとき、最後のカードは誰に配られるでしょうか?
解法 1:演算子「%」を使用する
上の並びは、「 から順に 1 ずつ増やしていき、 になった瞬間に にリセットする」というようになっています。
ここで、もし仮にリセットがないものとした場合には、答えは になります (植木算をしています)。ここが分かりにくいと感じた場合には、具体的な の値で確かめてみましょう。
- 番目:
- 番目:
- 番目:
この並びをみていると、一般に 番目は に を足したものであることがわかります。よって、 番目の値は となります。
リセットつき
ここまで来れば、リセットが存在する場合も容易に求められます。基本的には、 を で引いていき、 以下の値になれば、それが答えです。
たとえば、 で であれば、答えは です。 で であれば、答えは です。
を で割ってみましょう。
- 割り切れないときは、その余りが答え
- 割り切れるときは、 が答え
と考えれば良いです。
コード
#include <bits/stdc++.h> using namespace std; int main() { int N, K, A; cin >> N >> K >> A; int no_reset = A + K - 1; if (no_reset % N > 0) cout << no_reset % N << endl; else cout << N << endl; }
解法 (2)
何も考えずに for
文で書いてもよいでしょう。
#include <bits/stdc++.h> using namespace std; int main() { int N, K, A; cin >> N >> K >> A; int res = A; for (int i = 0; i < K - 1; ++i) { ++res; if (res == N+1) res = 1; } cout << res << endl; }