参考:http://blog.csdn.net/ericxieforever/archive/2008/04/27/2335646.aspx
先引入Joseph递推公式,设有n个人(0,...,n-1),数m,则第i轮出局的人为f(i)=(f(i-1)+m-1)%(n-i+1),f(0)=0;依次我们可以来做测试,只要前k轮中只要有一次f(i)<k则此m不符合题意。接下来我们考察一下只剩下k+1个人时候情况,那么依题意则这一轮出局的人要么在上一轮出局人的左边,要么就在右边,设上一轮出局的人为x,则必有m%(k+1)==0或1(还不明白就看下面两个序列表示的k+2人的情况(G表示好人,共有k个,B表示坏人,X表示上一轮出局的人)GG....GGBX,GG...GGXB)。所以测试数为t(k+1)或t(k+1)+1,t>=1。
#include<stdio.h>
int K;
int table[14];
int test(int k,int m)
{
int r=0;
int n=K<<1;
for(int i=0;i<K;i++)
{
r=(r+m-1)%(n-i);
if(r<K)
{
return 0;
}
}
return 1;
}
int main()
{
for(K=1;K<14;K++)
{
int m=K+1;
while(true)
{
if(test(K,m))
{
table[K]=m;
break;
}
if(test(K,m+1))
{
table[K]=m+1;
break;
}
m+=K+1;
}
}
while(scanf("%d",&K)&&K)
{
printf("%d\n",table[K]);
}
return 0;
}