题目大意:经典约瑟夫环问题,n个人,围成一圈,第一次删第m个人,以后每k个人删一次,问你最后留下的是谁。
思路:为了处理方便,我们约定n个人的编号为0~n-1,最后答案+1就好,先不考虑m,设f[ n ]为这n个人最后留下的编号,那么f[ n +1 ] =( f[ n ] + k)%(n+1),f[ 1 ] = 0。根据这个递推式,一直推到n-1,然后再来处理m的问题,第一个人我们是删m,那么最后n个人答案 f[ n ] = (f[ n-1 ] + m)%n+1。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN =11111 ;
int f[MAXN];
int main()
{
int n,k,m;
while(~scanf("%d%d%d",&n,&k,&m))
{
if(n+k+m==0) break;
f[1] =0;
for(int i = 2;i<n;i++)
f[i] = (f[i-1]+k)%i;
f[n] = (f[n-1]+m)%n;
printf("%d\n",f[n]+1);
}
return 0;
}