约瑟夫问题
全都是抄具体数学的 问题 \(1\) 有 \(n\) 个人围成一圈,顺时针从 \(1\) 到 \(n\) 编号,并从 \(1\) 开始报数,如果一个人报的数字是 \(2\) 的倍数,就把他撒了,后面的人继续,问最终活下来的人的编号 \(Sol1\) 记 \(J(n)\) 为最终活下来人的编号,有 \(J(1)=1\) 如果有 \(2n\) 个人,那么第一圈过去之后所有偶数编号的人都被撒了,那么可以看成还有 \(n\) 个人,只不过第 \(i\) 个人的编号是 \(2i-1\) ,所以有 \(J(2n)=2J(n)-1\) 如果有 \(2n+1\) 个人,那么第一圈过去之后所有偶数编号的人都被撒了,下一圈一开始 \(1\) 号被撒了,那么可以看成还有 \(n\) 个人,第 \(i\) 个人的编号是 \(2i+1\) ,所以有 \(J(2n)=2J(n)+1\) 如果我们记 \(k\) 为 \(n\) 的二进制最高位,有 \(J(n)=2(n-2^k)+1\) 打表证明即可 ,归纳证明即可 问题 \(2\) 有 \(n\) 个人围成一圈,顺时针从 \(1\) 到 \(n\) 编号,并从 \(1\) 开始报数,如果一个人报的数字是 \(3\) 的倍数,就把他撒了,后面的人继续,问最终活下来的人的编号 \(Sol2\) 如果还是按上面的递归式的方法不用做了 考虑一种新的方法, \(1\)