题目大意:给出N个数,从M之后的那个人开始数,数到K的人出去(M第一个出去),求最后还剩下谁
解题思路:约瑟夫问题,由公式可以求出最后一个出去的人,但是因为M是第一个出去的,所以最后的答案要稍微变形以下,偏移量为M,而且多计算了一次,所以还有减去K
所以答案为(A[n] + M + 1 - k) % N
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 10010
int A[maxn];
int main() {
int n, k, m;
while(scanf("%d%d%d",&n, &k, &m) == 3 && n + m + k) {
A[1] = 0;
for(int i = 2; i <= n; i++)
A[i] = (A[i - 1] + k) % i;
int ans = (A[n] + 1 + m - k) % n;
if(ans <= 0)
ans += n;
printf("%d\n",ans);
}
return 0;
}