类约瑟夫环问题

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类约瑟夫环问题相关的知识,希望对你有一定的参考价值。

类约瑟夫环问题


问题描述

聚会游戏:N 个人聚餐,编号从 1 到 N。从编号为 1 的人开始报数,报到M 的人喝一杯酒。下一个人再从 1 开始报数,如此循环往复。其中有一人非常讨厌喝酒,问他有没有机会不喝酒?他该如何做,为什么?


解答

​ 有机会。如果 N N N M M M 的最大公约数不为 1,就有机会。假设 K K K N N N M M M 的最小公倍数 ( l c m ) (lcm) (lcm),那么喝酒次数 K M \\dfrac{K}{M} MK 次,会回到原点。因为 N M = g c d × l c m = g c d × k NM=gcd\\times lcm=gcd\\times k NM=gcd×lcm=gcd×k,如果 g c d = 1 gcd=1 gcd=1,那么 K M = N \\dfrac{K}{M}=N MK=N,会把所有编号访问。


解析

​ 考虑从 1 1 1开始报数第一次回到 1 1 1的情况,假设一共有 a a a次循环,进行了 b b b轮。

即: a N = b M aN=bM aN=bM,因为要第一次回到 1 1 1,所以 a N aN aN要尽可能的小,所以 a N aN aN N , M N,M N,M的最小公倍数是最优的, l c m ( N , M ) = a N lcm(N,M)=aN lcm(N,M)=aN

所以 a N = N × M g c d ( N , M ) = b M aN=\\dfrac{N\\times M}{gcd(N,M)}=bM aN=gcd(N,M)N×M=bM

即: N = b × g c d ( N , M ) N=b\\times gcd(N,M) N=b×gcd(N,M)

g c d ( N , M ) = 1 gcd(N,M)=1 gcd(N,M)=1时,会有 N 1 = N \\dfrac{N}{1}=N 1N=N个不同的人被喝酒,所有的人都会喝酒。

所以没有人没有机会不喝酒。

g c d ( N , M ) ≠ 1 gcd(N,M)\\ne 1 gcd(N,M)=1时, b = N g c d ( N , M ) < N b=\\dfrac{N}{gcd(N,M)}<N b=gcd(N,M)N<N,所以必定存在某一个人可以不喝酒。


​ 此问题与约瑟夫环问题十分类似,该问题是在约瑟夫环的问题上,不进行删除数字。

以上是关于类约瑟夫环问题的主要内容,如果未能解决你的问题,请参考以下文章

Josephus环的四种解法(约瑟夫环)

Java解决约瑟夫环问题(通俗易懂版)

Java循环链表实现约瑟夫环(搬运)

约瑟夫环----循环链表问题

暑假OJ练习——8 圆桌问题(使用循环链表解决约瑟夫环问题)

Musical Chairs(约瑟夫环问题)