假设10个人从0 - 9 编号, 报到3淘汰
第一轮,10人场:0 1 2 3 4 5 6 7 8 9 淘汰者下标为2
第二轮, 9人场:3 4 5 6 7 8 9 0 1 淘汰者下标仍然为2,在上一轮中下标为 (2 + 3)% 10
第三轮, 8人场:6 7 8 9 0 1 3 4 淘汰者下标仍然为2,在上一轮中下标为 (2 + 3)% 9
第四轮, 7人场:9 0 1 3 4 6 7 淘汰者下标仍然为2,在上一轮中下标为 (2 + 3)% 8
第五轮, 6人场:3 4 6 7 9 0 淘汰者下标仍然为2,在上一轮中下标为 (2 + 3)% 7
第六轮, 5人场:7 9 0 3 4 淘汰者下标仍然为2,在上一轮中下标为 (2 + 3)% 6
第七轮, 4人场:3 4 7 9 淘汰者下标仍然为2,在上一轮中下标为 (2 + 3)% 5
第八轮, 3人场:9 3 4 淘汰者下标仍然为2,在上一轮中下标为 (2 + 3)% 4
第九轮, 2人场:9 3 淘汰者下标为0,在上一轮中下标为 (0 + 3)% 3
第十轮, 1人场:3 淘汰者下标为0,在上一轮中下标为(0 + 3)% 2
对于n个人, 报到m淘汰的情况,
我们可以肯定最后一个被淘汰在当前这一轮,肯定下标为0,那么我们就能根据以上规律推出他的上一轮下标为(0 + m)% 2 (因为他的上一轮肯定是2人场)
然后我们递推下去
直到推出这个人在n人场的下标即可。如果编号是1 - n 则可以让这个下标加一即可。
#include <bits/stdc++.h>
//#define int long long
const int MAXN = 1e6 + 7;
const int mod = 1000000007;
using namespace std;
signed main() {
int n, k;
cin >> n >> k;
int ans = 0;
for(int i = 2; i <= n; i ++){
ans = (ans + k) % i;
}
cout << ans + 1 << endl;
return 0;
}