标签:个数 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开始编号,于是
……先去上课。
标签:个数 blog uva 就是 变化 操作 为我 logs log
原文地址:http://www.cnblogs.com/yohanlong/p/7754601.html