码迷,mamicode.com
首页 > 其他好文 > 详细

uva3882

时间:2017-10-30 15:59:01      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:个数   blog   uva   就是   变化   操作   为我   logs   log   

约瑟夫问题的变形

看了网上的题解,这题有一个trick就是每轮删完点后将剩下的点重新编号,从0编到n-1。

这样操作之后,我们就可以对删点前后的两个状态进行递推了。

假设我现在有一排点,编号为0到n-1,现在我从0开始数k个删掉第k个点,也就是删掉点k-1。

剩下的点为0,1,2……k-2,k……,n-1

我从k这个点开始重新编号,即:

技术分享

这样子问题具有相似性了。(因为同样是从0开始数到第k个删掉)

那么怎么递推呢?

可以看出,想要恢复上一轮的编号,只需要+k再整体%n即可

如果记f[n] = n个数从0开始编号数到第k个删掉最后剩下的数的编号的话,

f[n]  = (f[n-1] + k) % n;(注意这里的n是变化的)

最后输出(m-k+1+f[n])%n,因为我们是从m开始的,且从1开始编号,于是

……先去上课。

uva3882

标签:个数   blog   uva   就是   变化   操作   为我   logs   log   

原文地址:http://www.cnblogs.com/yohanlong/p/7754601.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!