约瑟夫问题的数学解答:
假设一组n个数的序号为:1、2、3…n
令f(n,i)=x 为第i号的数为x
令k为每次淘汰的序号
那么我们可以知道对于上面组可以转换为
注意:if((k=k%n)==0)k=n.
k+1、k+2…n、1、2…k-1、k(已经被踢掉)
这组对应的序号我们可以找到
1、2…n-k、n-k+1、n-k+2…n-1
我们总结出公式:
f(n-1,i)= f(n,i+k) ; {1<=i<=n-k}
f(n,i-n+k); {n-k< i <=n-1}
其实我们可以简化一下:
if((j=(i+k)%n)==0)j=n;
f(n-1,i) = f(n,j);
从上面的推导我们可以看出,如果知道f(n,j),
我们就可以求出f(n-1,i)。
由于最初的一组数肯定满足f(n,i)=i。
于是我们可以明白要求出最后一个数,
那么肯定是有最开始的数决定。
假设有n个人,每次淘汰序号为k.
for(i=2,s=1;i<=n;i++)//逆向求解
if((s=(s+k)%i)==0)s=i;
由于f(n,i)=i,所以最后求出的s即为f(1,1)。