3.3 底和顶的递归式

\(1\):再探约瑟夫问题。
\(n\)个人围一圈,\(1,2,3\)依次报数,报到\(3\)的出局,问最后剩下人的编号。
假设\(n=10\),将人从左到右排成一行,初始编号为\(1,2,...,10\),编号为\(3\)的倍数的人出局。
将第一轮剩下的人\(1,2,4,5,7,8,10\)\(11\)开始重新编号,为\(11,12,13,15,16,17\),其中编号为\(3\)的倍数的人出局。
依此重复上述过程,直到最后一人出局停止。
观察前后两轮同一人的编号,则有\(N=n+10-\lfloor \frac{n}{3} \rfloor\),这是因为每轮编号增加\(10\),但其中有\(\lfloor \frac{n}{3} \rfloor\)个人已经出局。
\(f(x)\)表示编号\(x\)的下一个编号,显然只有\(f(3k+1)\)\(f(3k+2)\)有意义。
\(f(3k+1)=3k+1+10-k=2k+1+10\)
\(f(3k+2)=3k+2+10-k=2k+2+10\)
那么已知\(N\)\(n\),有\(k=\frac{N-10-x}{2},n=3k+x\),其中\(x\)取值需在满足\(k\)是整数的情况下尽可能小且不为\(0\)
那么可以直接写成\(k=\lfloor \frac{N-10-1}{2} \rfloor,x=N-10-2k,n=3k+x\)

现在来形式化给出问题的解,设当前有初始有\(n\)个人,报到\(m\)的出局的约瑟夫游戏。
求第\(i\)个人是第几个出局的,令\(t=i\),进行迭代\(t'=t+n-\lfloor \frac{n}{m} \rfloor\)
\(t\)\(m\)倍数时,迭代停止,此时\(\frac{t}{m}\)就是答案。
求第\(i\)个出局的是哪个人,令\(t=im\),进行迭代\(k=\lfloor \frac{t-n-1}{m-1}\rfloor,x=t-n-(m-1)k,t'=mk+x\)
\(t\in [1,n]\)时,迭代停止,此时\(t\)就是答案。
以上两种求法,复杂度均为\(O(mlog(nm))\)

关于复杂度分析,两种求法互逆,故相同。
对于第二种求法,考虑其最劣情况,即当\(i=n\)时的复杂度。
进一步改写迭代式,可写成\(t'=\lfloor \frac{t-n-1}{m-1} \rfloor +t-n\)的形式。
进行变量代换,\(D=3n+1-t\),即\(t=3n+1-D\)的形式,经过一系列化简,迭代式可写成:
\(D=1,D=\lceil \frac{m}{m-1}D \rceil\)的形式,当\(D\geq (m-1)n\)时停止,答案为\(mn+1-D\)
\(D\)近似成等比数列求解,可解得轮数约为\(\frac{ln(i(m-1))}{ln(m)-ln(m-1)}\)
\(\frac{1}{ln(m)-ln(m-1)}=m\),故总复杂度为\(O(mlog(nm))\)

可出题:给定\(n,m\)的约瑟夫游戏,询问第\(x\)个人是第几个出局的,以及第\(y\)个出局的人是哪个人。
\(1\leq n\leq 10^{12},1\leq m\leq 10^6\),要求复杂度\(O(mlog(nm))\)

posted @ 2025-06-28 14:20  junliang123  阅读(57)  评论(0)    收藏  举报