假设有n个人,每次从0数,删除第k个人。
此时编号
k 0
k+1 1
k+2 2
.....
倒着推会发现每一轮的胜利者编号都少了个K,然后利用递推复原回去。
f[n]=(f[n-1]+k)%n
直到最后一轮,最后的胜利者编号为0
f[1]=0,又由于本题是从编号为m,所以找到距m为k的位置即(m-k),所以答案为(f[n]+1+m-k)
由于m-k可能导致负数的情况,就再加n。
#include <bits/stdc++.h>
using namespace std;
const int maxn=10005;
int n,m,k;
int dp[maxn];
int main()
{
while(scanf("%d%d%d",&n,&k,&m)&&(n||m||k))
{
memset(dp,0,sizeof(dp));
dp[1]=0;
for(int i=2;i<=n;i++) dp[i] = (dp[i-1]+k)%i;
int ans = (dp[n]+m-k+1)%n;
ans = ((ans)%n+n)%n;
if(ans==0) ans=n;
printf("%d\n",ans);
}
return 0;
}