lấy được cả N người là sao :V Cái này tính gộp, nếu giữ nguyên k tìm n với nhiều giá trị khác nhau thì có thể tách cái pivots ra và cái dòng tìm index ra nữa thì sẽ tính được với tất cả n = 1…N luôn trong O(N logk + N loglogN) thay vì O(N k logN) :V
std::vector<std::pair<int, int>> josephusPivots(const int N, const int k)
{
std::vector<std::pair<int, int>> pivots{{1, 1}};
for (int n = 1, W = 1, m, r; n <= N; pivots.emplace_back(n, W))
m = (n - W) / (k - 1) + 1, n += m, r = (W + k * m) % n, W = r ? r : n;
return pivots;
}
int josephusIndex(const int N, const int k,
const std::vector<std::pair<int, int>>& pivots)
{
using namespace std;
auto [n, W] = *--upper_bound(begin(pivots), end(pivots), N,
[](int n, auto& p) { return n < p.first; });
return n == N ? W : W + k * (N - n);
}
//
auto pivots_k4_N1000 = josephusPivots(1000, 4); //O(k logN), k = 4, N = 1000
std::cout << josephusIndex(123, 4, pivots_k4_N1000) << "\n"; //O(logk + loglogN), k = 4, N = 1000
std::cout << josephusIndex(234, 4, pivots_k4_N1000) << "\n";
std::cout << josephusIndex(345, 4, pivots_k4_N1000) << "\n";
//v.v...
//std::cout << josephusIndex(1234, 4, pivots_k4_N1000) << "\n"; //lỗi vì 1234 > 1000