Na početku igre “Eci-peci-pec” \(n\) igrača sedi u krugu, pri čemu se može smatrati da su igrači numerisani brojevima od 1 do \(n\) u smeru kretanja kazaljke na satu. Nakon toga brojanje kreće od igrača sa rednim brojem 1 i odbrojava se \(k\) igrača u smeru kazaljke na satu. Igrač na kom se završi brojanje izlazi iz kruga, a brojanje ponovo počinje od igrača koji je bio sledeći u smeru kazaljke na satu. Pobednik je igrač koji poslednji ostane u krugu.
Napisati program koji za dato \(n\) i \(k\) proverava koji igrač će pobediti u igri.
Sa standardnog ulaza se učitavaju prirodni brojevi \(n\) (\(1 \leq n \leq 10^5\)) i \(k\) (\(1 \leq k \leq 10^6\)).
Na standardni izlaz ispisati redni broj igrača koji je pobedio u igri.
5 2
3
U ovom bloku se opisuje glavno rešenje zadatka.
#include <iostream>
using namespace std;
/* n\k 1 2 3 4 ...
* 1 0 0 0 0
* 2 1 0 1 0
* 3 2 2 1 1
* 4 3 0 0 1
* ...
*/
int josephus(int n, int k)
{
if (n == 1) return 0;
return (josephus(n - 1, k) + k) % n;
}
int josephus_iter(int n, int k)
{
int res = 0;
for (int N = 1; N <= n; N++) {
= (res + k) % N;
res }
return res;
}
int main()
{
int n, k; cin >> n >> k;
<< josephus_iter(n, k) + 1 << endl;
cout
return 0;
}
#include <iostream>
using namespace std;
/* n\k 1 2 3 4 ...
* 1 0 0 0 0
* 2 1 0 1 0
* 3 2 2 1 1
* 4 3 0 0 1
* ...
*/
int josephus(int n, int k)
{
if (n == 1) return 0;
return (josephus(n - 1, k) + k) % n;
}
int main()
{
int n, k; cin >> n >> k;
<< josephus(n, k) + 1 << endl;
cout
return 0;
}