约瑟夫环问题

f(n)表示有n个人,最后一个出局的人的编号
则f(n-1)表示有n-1个人,最后一个出局的人的编号

首先这一个大圆圈,我们从0开始给他们编号,然后开始从1报数,报数到K则出局
那么第一个出局的人,他的下标编号就是K-1

有一个出局的人之后,从他的下一个开始重新给他们编号,那么就是n-1个人,刚才编号是K的现在更新他的编号是0


灵魂画师.png

0 -- 1 -- 2 -- 3 (f[n-1],即更新后最后一个出局的人的下标编号)
k -- k+1 -- k+2 -- k+3 (最后出局的人原本的的下标编号)

那么我们就找到了 f(n-1) 和 f(n) 的一个对应关系
f(n) = (f(n-1) + k) % n

代码实现如下:


using namespace std;

const int N = 1000010;
int n, k;
int f[N];

int main()
{
    f[1] = 0;
    cin >> n >> k;
    for(int i = 2; i <= n ; i++)    f[i] = (f[i-1] + k) % i;
    
    cout << f[n] + 1 << endl;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编...
    xinggang阅读 1,172评论 0 1
  • 参考文章 约瑟夫环之二(用递归的思想解决Josephus问题) 解释 解法 初始情况: 0, 1, 2 ........
    Mjolnir1107阅读 1,077评论 0 1
  • 好久没有看有关算法的问题了,今天废了不少劲,再感叹一句:要想学好算法就要常练习,没什么捷径可走。废话不多说,如下:...
    时间已静止阅读 6,962评论 0 11
  • 百度百科: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆...
    KPort阅读 3,993评论 0 4
  • 2019年对于韩国娱乐三巨头之一的YG来说,可谓是多灾多难。核心男团Bigbang多人服役,唯一活跃在公众视野中的...
    水门汀女孩阅读 3,894评论 1 2

友情链接更多精彩内容