約瑟夫環 遞推公式

2022-07-27 13:51:25 字數 987 閱讀 4300

遞推公式:f(

n,m)

=(f(

n−1,

m)+m

)%n'>f(n,m)=(f(n−1,m)+m)%nf(

n−1,

m)'>1  2  3  4  5  6  7  8  9  1001

2345

6789

1234

5678

91045

6789

10127

89101

24510

1245

7845

78101

81014

5458

101045

1044f

(n−1

,m)'>第·一行綠色那行是陣列下標,第二行是每個人的編號f(

n−1,

m)'>現在逆向推導

f(n

−1,m

)'>那麼這個公式是怎麼推導的呢?

f(

n−1,

m)'>1.假設我們已經知道了10個人時,勝利者的下標為3,那下一次9個人時,勝利者的下標為多少?f(

n−1,

m)'>其實就是10個人時殺掉了編號為3(即陣列下標為2)的人後,後面的人都往前移動了3位,所以勝利者的下標由3變成了0f(

n−1,

m)'>2.那我們倒過來我們知道9個人時,勝利者的下標為0,那10個人時勝利者的下標為多少?f(

n−1,

m)'>其實這和上面的問題一樣,這是這是上個問題的逆過程,就是把大家都往後移動3位,所以f(10,3)=f(9,3)+3,不過可能會出現陣列越界所以要取模變成f(10,3)=(f(9,3)+3)%10f(

n−1,

m)'>3.那麼人數改為n報到m時就殺掉陣列怎麼移動呢f(

n−1,

m)'>一樣的,殺一人則後面的人的下標都往前移動m則,f(n,m)=(f(n-1,m)+m)%n

約瑟夫環問題(遞推公式)

約瑟夫環問題在 具體數學 一書上講得十分詳細 基本問題描述 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。也類似於 殺人狂問題 通常解決這類問題時...

約瑟夫環遞推公式推導

一共有 n 個人,編號為1,2,n,這些人圍成乙個圈子,然後指定乙個數 m 從 1 號開始,數到 m 的人出列,並且下乙個人重新開始由 1 計數,問最後乙個出列的人是幾號?1.通常這類問題會想到使用鍊錶解決,每 m 個就刪除乙個節點 2.也可以用迴圈陣列的方式,對陣列的下標取模 對於以上兩種方法都不...

知識點 約瑟夫環遞推公式

傳送 遞推公式 f 1 0,f n f n 1 k n。f i 是有i個人時,勝出的那個人的編號 編號從0 n 1 我一開始一直沒理解這個遞推是怎麼來的,後來終於理解了 假設問題是從n個人編號分別為0.n 1,取第k個,則第k個人編號為k 1的淘汰,剩下的編號為 0,1,2,3.k 2,k,k 1,...