原始的Joseph问题的描述如下:有n个人围在一个圆桌桌位,把这n个人一次编号为1,2,3,4,5......n,从编号是1的人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,疏导第m个人又出列,如此反复直到所有人全部出列,例如当n=6,m=5时,出列的顺序依次为:5,4,6,2,3,1
现在的问题是,假设有k个好人和k个坏人,好人的编号为1~k,坏人的编号为k+1~2k,我们希望求出m的最小值,使得最先出列的k个人都是坏人。
输入:仅有的一个数字k(0<k<14) SAMPLE INPUT:4
输出:使得最先出列的k个人都是坏人的m的最小值 SAMPLE OUTPUT:30
#include<stdio.h>
long k,m,begin;
int check(long remain)
{
long result=(begin+m-1)%remain;
if(result>=k)
{
begin=result;
return 1;
}
else
return 0;
}
int main()
{
long i,find=0;
scanf("%d",&k);
m=k;
while(!find)
{
find=1;
begin=0;
for(i=0;i<k;i++)
if(!check(2*k-i))
{
find=0;
break;
}
m++;
}
printf("%d\n",m-1);
return 0;
}