`

Joseph—约瑟夫环 线性复杂度

阅读更多
    说有n个要被处决的人(编号0~(n-1)),从0开始报数,报到(m-1)的会被杀掉,剩下的人继续从0开始报数,如此下去最后剩的一个人会存活下来。说Joseph发现了这个规律而且把他透露了出来,现在假如你在这n个人里面,你会选择几号位置站下。

  很显然你会选择能活下来的那个位置,所以问题就是如何得到这个位置。

  首先想到的是模拟(至少我笨脑子是这么想的),但无论是用链表还是用数组这个时间复杂度都是比较高的,至少交题的时候会TLE,这里介绍一种线性时间的解法,出自大师Knuth的哦。

  考虑下第一次杀人的时候,编号为k = (m - 1) % n的同学挂了,那我们从k + 1重新从0开始编号

  k + 1 ==> 0

  k + 2 ==> 1

  ……

  ……

  k - 2 ==> n - 2

  k - 1 ==> n - 1

  好了,剩余的n - 1个同学又组成了一个新的Joseph环,对新环来说,编号k = (m - 1) % (n - 1)的同学会挂,如此下去,这里面似乎有某种规律可寻。

  考虑到不会死的同学一直不会被杀(废话),我们设i个同学时的不会挂的同学的编号(即解)为x,那么当死掉一个同学剩余i - 1个同学的时候,x仍然不会被杀,但此时的x已经由编号变换变成了x’,即x’是i - 1的情况时的解!一直推下去直到i - (i - 1)即1的情况,那1的时候解明显是0嘛!(注意编号是从0开始的),倒推回来,那问题不就解决了么!

  好了,分析清楚了剩下的就只是数学推导了,这个我比较烦,直接给公式吧:

  向下变换:x’ = (x - (k + 1)) % i;

  向上变换:x = (x' + k + 1) % i;

  其中:  k = (m - 1) % i;

  带入可得:x = (x’ + m) % i;

令f[i]表示i个人玩游戏报m退出,最后胜利者的编号自然是f[n],递推公式:
f[1]=0;
f[i]=(f[i-1]+m)%i; (i>1)
分享到:
评论

相关推荐

    数据结构约瑟夫环和多项式乘法

    在这个主题中,我们将探讨两个重要的数据结构问题:约瑟夫环(Josephus Problem)和多项式乘法。这两个概念在算法设计和复杂性理论中都有深远的影响。 **约瑟夫环**是一个著名的理论问题,由数学家约瑟夫·...

    稀疏矩阵运算器(约瑟夫(Joseph)问题的一种描述...)

    【循环链表】是一种特殊的链表结构,它的最后一个节点的指针域指向链表的第一个节点,形成一个闭合的环。这种结构允许从链表的任意节点开始遍历整个链表。循环链表的主要操作与线性链表类似,但在判断链表末尾时,...

    浙江大学ACM模板

    - **Joseph问题**:经典的约瑟夫环问题。 - **N皇后构造解**:在棋盘上放置N个皇后,使得任意两个皇后不会互相攻击。 - **模式匹配(kmp)**:KMP算法用于字符串匹配。 - **最长公共单调子序列**:寻找两个序列中最长...

    浙江大学 acm模板 算法代码实现

    Joseph 问题是一个经典的循环队列问题,也称为约瑟夫环问题。 **13.2 N 皇后构造解** N 皇后问题是将 N 个皇后放置在一个 N×N 的棋盘上,使得没有任何两个皇后位于同一行、同一列或同一对角线上。 **13.3 布尔母...

    FFT程序编写

    傅立叶变换是由法国数学家和物理学家让·巴蒂斯特·约瑟夫·傅立叶(Jean Baptiste Joseph Fourier, 1768-1830)提出的。傅立叶在1807年的一篇论文中首次提出了一个极具争议的观点:**任何连续周期信号都可以通过一...

    从头到尾彻底理解傅里叶变换算法.pdf

    傅里叶变换是由法国数学家约瑟夫·傅里叶(Joseph Fourier)提出的,他发现任何周期性函数都可以表示为不同频率的正弦波的叠加。这一发现极大地推动了数学、物理学和工程学的发展。 ### 连续傅里叶变换 #### 定义 ...

Global site tag (gtag.js) - Google Analytics