约瑟夫环:编号从0开始,第一个出去的人是(k-1)%n,重新编号,出去的人的下一位编号为0,以此类推,最后一个出去的人的编号一定为0,f[1] = 0;当第一个人出去后,剩下n– 1 个人出去编号f[9] =(k - 1) % (n – 1), 还原原来队列编号(f[n - 1] + k) % (n – 1 + 1); 编号从0开始 ...
当n个人围成一圈并以m为步长第一次报数时,第m个人出列,此时就又组成了一个新的,人数为n-1的约瑟夫环,要求n个人的约瑟夫环问题的解,就依赖于求n-1个人的约瑟夫问题的解,要求n-2个人的约瑟夫问题的解,则依赖于求n-2个人的约瑟夫换问题的解,依次类推,直至求1个人的时候,...
约瑟夫环——递推公式 0123456789 12345678910 4567891012 789101245 10124578 4578101 810145 45810 1045 104 4约瑟夫环——递推公式 递推公式:f(N,M)=(f(N−1,M)+M)%N f(N,M)表⽰,N个⼈报数,每报到M时杀掉那个⼈,最终 f(N−1,M)表⽰,N-1个⼈报数,每报到M时杀掉那个⼈,最终...
* @功能 约瑟夫环 * @参数 total:总人数 * @参数 from:第一个报数的人 * @参数 count:出列者喊到的数 * @作者 zheng * @更新 2013-12-5 */ void JOSEPHUS(int total, int from, int count) { Node *p1, *head; head = NULL; int i; ...
约瑟夫环——递推公式 )=(f(N−1,M)+M)%N f(N,M)表示,N个人报数,每报到M时杀掉那个人,最终 f(N−1,M)表示,N-1个人报数,每报到M时杀掉那个人,最终胜利者的编号 现在假设有10个人,报到3的人就会被杀掉,我们用数字给这十个人编号为...
约瑟夫环的递推公式2.jpg 对于f(n, m),就是我们图上要求的在第1轮中最终元素所处的index,根据第2轮的假设,最终元素在第2轮数列中的index是x,即从M元素开始,向后数x次,即可到达最终元素。由于第2轮只是比第1轮少了元素M-1,所以我们在第1轮的数列中的M元素向后数x次就能找到最终元素。假设x比较小,那...
n阶约瑟夫环的结果 (ans + m % n)%n,那么我们还可以将该式进行一下简单的化简: 当m<n时,易得上式可化简为:(ans + m)% n 而当m>=n时,那么上式则化简为:(ans % n + m%n%n)% n 即为:(ans % n + m%n)% n 而(ans + m)% n = (ans % n + m%n)% n ...
简介:约瑟夫环——公式法——附LeetCode—剑指offer题目—剑指 Offer 62. 圆圈中最后剩下的数字 约瑟夫环问题: 约瑟夫问题是个著名的数学问题,N个人围成一圈,从第一个人开始数,杀掉第M个人。然后从第M+1个人再开始数,数到第M个人再杀掉,然后再从第M+1个人开始数,数到第M个人再次杀掉,反复进行,直到这圈...
我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始): k k 1 k 2 ... n-2, n-1, 0, 1, 2, ... k-2并且从k开始报0。 现在我们把他们的编号做一下转换: k --> 0