前言
今天在做OpenJudge的时候遇到了约瑟夫问题,然后搞了一下午,很疲惫,最后发现可以数学公式推导,于是想把这个问题整理出来。
约瑟夫问题
有n个依次报数,报数为m的人出局,然后从1开始接着报数,最后一个人是幸存者。人的编号为0~m-1.
-
最后幸存者的序号
具体的推导过程可以查看百度百科,其他博客上的推导过程与百科没有太大差别,我都没怎么看懂。递推公式如下: f ( 1 , m ) = 0 f ( n , m ) = ( f ( n − 1 , m ) + m ) % n f(1,m)=0 \quad f(n,m)=(f(n-1,m)+m)\%n f(1,m)=0f(n,m)=(f(n−1,m)+m)%n注意,输出的人的编号是0~m-1,如果题目是从1开始编号的话需要将最后的结果加1进行输出。 -
输出的序列
在网上查找了关于joseph问题的输出序列,好像并没有现成的公式可以求解,只能按照链表的方式进行递推,时间复杂度为O(mn)。时间复杂度为O(n)的解法暂时还为找到,如果有同学知道可以私信交流一下。
4008

被折叠的 条评论
为什么被折叠?



