約瑟夫環問題數學解法

2021-06-16 18:37:24 字數 749 閱讀 2047

首先一開始的序列

序列1: 1, 2, 3, 4, …, n-2, n-1, n

此時出佇列的第乙個人,位置為k,號碼肯定是m%n。這個應該沒有問題,也就是取餘操作使得陣列類似能夠有迴圈的功能。

此時序列2: 1, 2, 3, 4, … k-1, k+1, …, n-2, n-1, n

此時k出佇列,序列2中為n-1個人了。

根據序列2,得到序列3:

k+1, k+2, k+3, …, n-2, n-1, n, 1, 2, 3,…, k-2, k-1

從序列2得到序列3很簡單,也就是將k+1作為開始,然後將1連到n的後面,其實只是位置的不同,但是本質兩個序列是一樣的。所以同樣,這裡也是n-1個元素。

序列3可以對映得到序列4:

1, 2, 3, 4, …, 5, 6, 7, 8, …, n-2, n-1

這裡我就亂掉了,這個對映是可以做,但是對映關係是怎樣的?

ok,先不管對映關係,我們繼續來推導。

對於序列4,我們假設能夠得到解,也就是最後乙個退出的人的號碼,設定為x。如果我們能夠通過對映關係,將x在序列3中對應的號碼x』求出來,那我們就可以得到序列3的解,因為序列3其實和序列2是同乙個,所以序列2的解我們也就得到了,序列2就是序列1去掉乙個k,這個k對於序列1的解沒有任何影響,所以序列1的答案就是求出來的x』。

x'有兩種情況 即x'=x-k 或者 x'>n時 x'=(n+x)-k 因此 x=(x'+k)%n; 

所以可以遞推為f(i)=(f(i-1)+k)%n;

約瑟夫環數學解法

無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達o nm 當n,m非常大 例如上百萬,上千萬 的時候,幾乎是沒有辦法在短時間內出結果的。我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是要讀者模擬整個過程。因此如果要追求效率,就要打破常規...

約瑟夫環 數學解法

約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍 從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。f 1 0 f i f i 1 m i i 1 includeusin...

約瑟夫環問題的數學解法

無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達o nm 當n,m非常大 例如上百萬,上千萬 的時候,幾乎是沒有辦法在短時間內出結果的。我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是要讀者模擬整個過程。因此如果要追求效率,就要打破常規...