#include <iostream>
#include <string>
#include <vector>
using namespace std;

#include "util.h"

ostream & operator<<(ostream & os, vector<int> & v) {
    os << "[";
    for(unsigned int i = 0; i < v.size(); i++) {
        os << v[i];
        if(i != v.size() - 1) {
            os << ", ";
        }
    }
    os << "]";
    return os;
}

int _increment_to_next_looser(const vector<bool> & players,
                                            int start, const int step) {
    int counter = 0;
    // the test examples in the pdf have us start by killing the m-1th person
    // offset by one for some dumb reason
    int attempt = start - 1;
    while(counter != step) {
        attempt = (attempt + 1) % players.size();
        if(players[attempt]) {
            counter++;
        }
    }
    return attempt;
}

vector<int> _play_game(vector<bool> & players, int step) {
    vector<int> loosers;
    int token = 0;
    while(loosers.size() < players.size()) {
        token = _increment_to_next_looser(players, token, step);
        players[token] = false;
        loosers.push_back(token);
    }
    return loosers;
}

int _test_run(int n, int m, bool verbose) {
    if(m < 1) {
        throw string("rule violation: m > 0");
    }
    vector<bool> players(n, true);
    vector<int> loosers = _play_game(players, m);
    if(verbose) {
        cout << loosers << endl;
    }
    return loosers[loosers.size()-1];
}
