約瑟夫環的問題1

2021-08-18 22:32:35 字數 2482 閱讀 5769

n個人做成一圈,順時針由1開始給他們編號,然後由第乙個人進行報數,數到m的人出局,接著下乙個人又從1開始報數,只剩最後乙個人的時候求這個人的編號

特例:當m = 2的時候

① n = 2^k

如果只有2個人,顯然剩餘的為1號如果有4個人,第一輪除掉2,4,剩下1,3,3死,留下1 。如果是8個人,先除去2,4,6,8,之後3,7,剩下1,5,除去5,又剩下1了

遞推,起始我們仔細分析也就是每次除去一半的元素,然後剩餘的一半繼續重複之前的策略,再除去一半。(可想到遞迴)

結合:j(2) = 1我知道兩個數,從1開始,肯定是2先死,剩下1.

得到:j(2^k)= 1

②當 n != 2^k (n = 9  11)

n 不等於2^k時,就不存在這樣的easy的規律了,重新分析:

假設n =9,這時候如圖下: 

能看出來,我們

乾掉第乙個人也就是2

,之後就只剩下8個人了,又回到j(2^k)上了,

這時候我們需要的是找到當前的1號元素

。 見圖下: 

這時候,我們從3號開始,就成了另外乙個規模小1的約瑟夫問題(恰好為2^k的特例)。 

這時候,我們可以把3號看成新的約瑟夫問題中的1號位置: 

j(8) = j(2^3) =1,也就是說這裡的1代表的就是上乙個問題中的3號

so:j(9) =3 

答案為3號

同理可知所有的非2^k的數都是這樣:

【找到新的1號】

假設n = 2^k +t,t可以隨意取,比如1,2,3…….

假設n = 11,這時候n =2^3 +

3,也就是說

t = 3

,所以開始

剔除元素直到其成為2^k問題的約瑟夫問題

。 so,我們在剔除了t(3)個元素之後(分別是2,4,6),此時我們定格在2t+1(7)處,並且將2t+1(7)作為新的一號,而且這時候的約瑟夫環只剩下2^3,也就是j(2^3+ 3) = 2*3 + 1 = 7,答案為7

總結一下這個規律:

j(2^k + t) = 2t+1

3.當q不等於2的情況下:

當q≠ 2:

我們假定: 

- n —n人構成的約瑟夫環 

- q —每次移除第q個人 

約定: 

-jq(n)表示n人構成的約瑟夫環,每次移除第q個人的解 

- n個人的編號從0開始至n-1

我們沿用之前特例的思想:能不能

由jq(n+1)的問題縮小成為j(n)的問題

(這裡的n是n+1規模的約瑟夫問題消除乙個元素之後的答案),jq(n)是在jq(n+1)基礎上移除乙個人之後的解。也就是說,我們能由jq(n)得到jq(n+1)。

規律:jq(n+1) = (jq(n) + q ) / (n+1)

初始情況: 0, 1, 2......n-2, n-1 (共n個人)

第乙個人(編號一定是(m-1)%n,設之為(k-1),讀者可以分m=n的情況分別試下,就可以得出結論) 出列之後,

剩下的n-1個人組成了乙個新的約瑟夫環(以編號為k==m%n的人開始):

k k+1  k+2  ... n-2, n-1, 0, 1, 2, ...,k-3, k-2 

現在我們把他們的編號做一下轉換:

x'-> x

k    --> 0

k+1   --> 1

k+2   --> 2

......

k-2   -->n-2

k-1   -->n-1

變換後就完完全全成為了(n-1)個人報數的子問題,假如我們知道這個子問題的解:例如x是最終的勝利者,那麼根據上面這個表把這個x變回去不剛好就是n個人情況的解嗎!

x ->x'

?(這正是

從n-1時的結果反過來推n個人時的編號

!)0 -> k

1 -> k+1

2 -> k+2

......

n-2 -> k-2

變回去的公式

x'=(x+k)%n

那麼,如何知道(n-1)個人報數的問題的解?只要知道(n-2)個人的解就行了。(n-2)個人的解呢?只要知道(n-3)的情況就可以了---- 這顯然就是乙個遞迴問題:

令f[i]表示i個人玩遊戲報m退出最後勝利者的編號,最後的結果就是f[n]

遞推公式

f[1]=0;

f[i]=(f[i-1]+k)%i =(f[i-1] +m%i) % i = (f[i-1] + m) % i ;  (i>1)

class joseph:

def getresult(self, n, m):

# write code here

res = self.josephus(n,m)

return res + 1

def josephus(self,n,m):

if n == 1:

return 0

else:

return (self.josephus(n-1,m)+m)%n

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...

約瑟夫問題 約瑟夫環

約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...

約瑟夫環1

有n個小孩圍成一圈,給他們從1開始依次編號,現指定從第w個開始報數,報到第s個時,該小孩出列,然後從下乙個小孩開始報數,仍是報到s個出列,如此重複下去,直到所有的小孩都出列 總人數不足s個時將迴圈報數 求小孩出列的順序。input 第一行輸入小孩的人數n n 64 接下來每行輸入乙個小孩的名字 人名...