算法小站
首页
wiki
新鲜事
文章搜索
网站导航
回忆录
首页
wiki
新鲜事
文章搜索
网站导航
回忆录
登录
注册
算法基础
搜索
数据结构
字符串
数学
图论
动态规划
计算几何
杂项
wiki 主题
算法基础
搜索
数据结构
线段树
线段树单点修改
线段树区间修改
可持久化线段树
树链剖分
平衡树
FHQ-Treap
珂朵莉树
字符串
数学
图论
图的连通性
有向图的强连通分量
无向图的割点割边和双连通分量
流和匹配
最大流
最大流的一些应用
动态规划
计算几何
杂项
启发式合并
高精度
一些经典问题
约瑟夫环
主题名称
是否为父主题
是否为其添加wiki文章
取 消
确 定
选择主题
修改主题名称
修改父主题
修改wiki文章
取 消
删 除
修 改
算法基础
搜索
数据结构
字符串
数学
图论
动态规划
计算几何
杂项
杂项
启发式合并
高精度
一些经典问题
约瑟夫环
[[ item.c ]]
0
0
约瑟夫环
## 约瑟夫环 **问题描述** 从标记$$1\sim n$$的圆圈,第$$1$$个人开始,每个人依次顺时针地杀死他旁边的,**仍然存活的人** 具体地,第一轮,编号是$$1$$的杀死编号$$2$$,接着编号$$3$$杀死编号$$4$$,以此类推 直到只有一个人幸存下来,问幸存下来的这个人,他的初始编号是多少? **算法分析** 考虑递归过程中,子问题和原问题之间,**编号的映射关系** > 子问题中,假设最后存活的人的编号是`J`,对应到原问题,编号是多少呢? **对于偶数的情况**  **对于奇数的情况**  递推关系如下 ```math \displaystyle \begin{cases} J(1) = 1 \\ J(2n) = 2J(n) - 1 \\ J(2n+1) = 2J(n) + 1 \end{cases} ``` **封闭形式** 根据$$J(2n) = 2J(n) - 1$$这样的递推形式,考虑$$J(n)$$的封闭形式,不妨先看$$n = 2^m$$的情形,$$J(2^m) = ?$$ > 当$$n = 2^m$$时 ```math \displaystyle J(n) = 2J(\dfrac{n}{2}) - 1 = 2\left( 2J(\dfrac{n}{2^2}) - 1 \right) - 1 \\ = 2^2 J(\dfrac{n}{2^2}) - 2^1 - 2^0 = 2^3 J(\dfrac{n}{2^3}) - 2^2 - 2^1 - 2^0 \\ = 2^m J(1) - 2^{m-1} - \cdots - 2^1 - 2^0 = 1 ``` 可知形如$$J(2^m) = 1$$ > 对于一般形式的递推,怎么求? 不难发现,$$J(2n+1) - J(2n) = 2$$,即可以先求出偶数项,然后根据偶数项来推相邻的奇数项 > 实际上 ```math \displaystyle J(2^m+1) = J(2^m) + 2 = 2 + 1 \\ \quad \\ J(2^m + 3) = J(2^m + 2) + 2 = 2J(2^{m-1} + 1) - 1 + 2 \\ =2\left( J(2^{m-1}) + 2 \right) + 1 = 6 + 1 ``` 以此归纳,不妨设$$n = 2^m + l$$,$$0 \leqslant l < 2^m$$,即将$$n$$分成若干个$$2^m$$段 记$$l$$是剩下的**不完整**的段,我们有$$J(2^m + l) = 2l + 1$$
看完文章有啥想法
发布评论
目录
[[ item.c ]]
17 人参与,0 条评论