题目:http://poj.org/problem?id=1012
描述:有2n个人围成一个圈,前n个人是好人,后n个人是坏人,玩一个游戏,给定一个m,当数到m的人出队,由剩下的人开始重新数,不断循环。问一个最小的m,使得后k个坏人全部出队时,还没有一个好人出队。(约瑟夫的变形)
约瑟夫:http://baike.baidu.com/view/213217.htm
由于n比较小,所以先打表。
#include<stdio.h>
#include<string.h>
int check[20];
int num[15];
void aa()
{
int i,j,n,m,s;
for(n=1;n<14;n++)
{
m=2*n;
for(i=n+1;;i++)
{
s=0;
memset(check,0,sizeof(check));
for(j=1;j<=n;j++)
{
s=(s+i-1)%(m+1-j);
if(s<n)
break;
}
if(j==n+1)
{
num[n]=i;;
break;
}
}
}
}
int main()
{
int i,j,n,m,s;
aa();
while(scanf("%d",&n)>0,n)
{
printf("%d\n",num[n]);
}
return 0;
}