约瑟夫问题
约瑟夫问题
\(n\)个人围成环,顺序编号,从\(1\)号开始依次报数,报到\(m\)的人出局,从他的下一位开始重新报数,问最后剩下的人的编号
方法很多,下面主要是公式法
递推公式:
\(f(1) = 0\)
\(f(i) = [f(i-1)+m]\%i\)
\(ans = f(n) + 1\)
约瑟夫问题优化
当\(k=1\)的时候,\(i\)每增加\(1\)编号\(+1\),可以直接算出\(f(n) = f(1) + n - 1\)
当\(n\)很大的时候,可以按照这种思路简化递推过程。
在递推过程中,\(f(x) + m\)会在很长的范围内\(<i\)
假设有\(p\)个范围, 那么这些范围合并后的结果就是\(f(x) + p\times m\)。可以直接算出答案,跳过部分递推过程
条件限制为\(f(x) + p\times m < i + (p - 1)\)
证明
当\(p = 1\)时,条件限制为\(f(x) + m < i\)
当\(p = 2\)时,条件限制为\(f(x+1) + m < i + 1 = f(x) + 2\times m < i + 1\)
当\(p = p\)时,条件限制为\(f(x) + p\times m < i + (p - 1)\)
化简可得到\(m < \frac{i - f(x)- p - 1}{p}\)
这样,\(i += p\),\(f(x) += m\times p\),跳过部分递推过程。
若\(i + p > n\),说明跳越界了,这时候可以直接算出\(f(n) = f(x) + (n - i - 1)\times p\)。
约瑟夫问题的变形
\(n\)个人围成环,顺序编号,从\(1\)号开始依次报数,第\(i\)轮报到\(i\)的人出局,从他的下一位开始重新报数,问最后剩下的人的编号
思路:和原本的约瑟夫问题的唯一区别是:\(m\)值不固定。
将最后剩下的人记作\(q\),那么在上一轮(第\(x-1\)轮)中的出局者所报的号为\(x-1\),第\(x\)轮中\(q\)的报号为\(x\)
可以得出公式\(f(n) = (f(n-1) + n - (i - 1)) % i\),\(i\in [2,n]\),\(n - (i - 1)\)是进行每一轮时的人数

约瑟夫问题
浙公网安备 33010602011771号