Book--约瑟夫环
2015-05-07 19:31:50
总结:一个数学上的问题,小结一下吧。
问题:N个人顺时针站成一圈,编号1~N,初始位置为1,每次让第m个人出列,问最后剩下的人的编号。
首推:blog
总结下来有那么四条公式,每次让第m个人出列。
-
f[1]=0; f[i]=(f[i-1]+m)%i; (i>1)
- f(0)= 0,f(i) = (f(i-1)+m)%(n-i+1)。【如f(2)=(f(1)+m)%(n-1)】
-
f[1]=1; f[i]=(f[i-1]+m)%i (i>1); if(f[i]==0) f[i]=i;
-
P(1, m, k)=1 (i = 1); P(i, m, k)=[P(i - 1, m, k ) + m - 1] % i + 1 (i > 1, 此处先减1是为了让模i的值不为0)
I:公式2能求出每一轮的位置(0~N-1)
II:最重要的是第1条公式,f[i]表示i个人做约瑟夫环游戏,最后剩下的人的编号(0~i-1)
公式简证:
设现在有n个人,编号:0,1,2,....,n-2,n-1,位置在0
第m个人(编号m-1)出列后:0,1,2,..,m-2,m,m+1,...,n-1 ①
--> 剩下的n-1个人重新构成: 0,1,2,....,n-2 ②
--> ①②两式形成位置映射:相当于把①的m~n-1部分全减去m放在前面,①的 0~m-2 部分全加上n-m放在后面。(其实用环结构来想就很好理解了)
--> 所以要把n-1个人序列里面的位置还原到n个人的序列里的位置,就要加上m(因为n-1序列里的0在n序列里是m-1)
--> 推得从n-1转移到n,有逆推公式 f[i] = (f[i-1] + m) % i (i>1)