Book--约瑟夫环

2015-05-07 19:31:50

总结:一个数学上的问题,小结一下吧。

  问题:N个人顺时针站成一圈,编号1~N,初始位置为1,每次让第m个人出列,问最后剩下的人的编号。

  首推:blog

  总结下来有那么四条公式,每次让第m个人出列。

  1. f[1]=0; f[i]=(f[i-1]+m)%i; (i>1)

  2. f(0)= 0,f(i) = (f(i-1)+m)%(n-i+1)。【如f(2)=(f(1)+m)%(n-1)】
  3. f[1]=1; f[i]=(f[i-1]+m)%i  (i>1);   if(f[i]==0) f[i]=i;

  4. 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)

 

posted @ 2015-05-07 19:49  Naturain  阅读(121)  评论(0编辑  收藏  举报