【ICPC-89】uva 1394 - And Then There Was One

该博客详细介绍了如何使用数学递推法解决UVa 1394题目的约瑟夫环变形问题。通过分析问题描述,指出当第一个人(编号为m-1)出列后,剩余的人形成一个新的约瑟夫环,并进行编号转换。博主提出了递推公式f[n]=(f[n-1]+k)%n来求解n个人时最后胜利者的编号,其中f[1]=0。对于从m开始的情况,递推公式变为f[n]=(f[n-1]+m)%n。文章包含完整的解题思路和代码实现。
摘要由CSDN通过智能技术生成

点击打开链接uva 1394

 

思路: 数学递推
分析:
1 题目是一道变形的约瑟夫环变形问题
2 网上看到一篇很好的数学递推法
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。

编号0-(n-1)是有意义的,因为要模n,所以用0-(n-1)更好操作

我们知道第一个人(编号一定是(m-1) mod n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m mod n的人开始):
k k+1 k+2 ... n-2,n-1,0,1,2,... k-2
并且从k开始报0。
现在我们把他们的编号做一下转换:
k --> 0
k+1 --> 1
k+2 --> 2
...
...
k-2 --> n-2
变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相信

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值