约瑟夫问题
约瑟夫问题
准备了下初赛,然而发现有好多约瑟夫问题都不会...
首先是明确一下问题及其细节.
问题是有\(n\)个人,从\(0\)开始标号(这样接下来的运算会比较方面,因为%%%),围成环状,数到第\(k\)个人就杀掉,再继续数数,问最后留下的是哪个人.
\(k=2\)的特殊情况.
我们考虑一轮杀下来,再重新编号的话.
如果\(n\%2==0\),重新标号后位置为\(x\)的人就是
原来标号为\(x\times 2\)的人
否则\((n\%2==1)\),重新标号后位置为\(x\)的人就是原来表还为\(x\times 2+2\)的人.
由此得出递推式
\[f(n)=2\times f(n/2)(n\%2==0)
\]
\[f(n)=2\times f(\lfloor n/2\rfloor)+2(n\%2==1)
\]
然后打出一张表
\[n=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
\]
\[f(n)=0,0,2,0,2,4,6,0,2,4,6,8,10,12,14,0
\]
可以发现
\[f(n)=2\times l(将n表示为2^m+l,0<=l<2^m)
\]
\[=将n的二进制最高位去掉再左移一位
\]
Proof:
应用数学归纳法.嘛...oier不需要详细证明