由約瑟夫問題到一類特殊的遞迴式

2022-05-07 20:54:11 字數 4033 閱讀 5213

前言:

其實。。本文和約瑟夫問題沒什麼關係。。題目是吸引你點進來的。

正文:約瑟夫問題

這個,大家應該都知道吧,不知道的可以看一看這個

下面是約瑟夫問題的乙個簡化版本:

有n個人圍成乙個環,依次編號為1到n,然後1,2報數,報到2的人出列,求最後出列的人的編號。

首先,我們打表找規律一下,規定j(n)表示n個人的約瑟夫問題中最後出列的人的編號。

nj(n)11

2133

4153

6577

8193

\(\cdots\)

\(\cdots\)

好像,全是奇數?

其實,在第一輪時,轉一圈後所有的偶數都出列了,剩下的當然只有奇數。

那麼我們考慮一下轉一圈後的情況:

當n為偶數時,轉一圈刪掉了n後又回到了1號,這時,原來編號為i的人的位置現在的人的編號變成了2*i-1,所以我們可以得到:

\[j(2n)=2j(n)-1

\]當n為奇數時,轉一圈刪掉了n-1後又刪掉了1號,來到了3號,這時,原來編號為i的人的位置現在的人的編號變成了2*i+1,所以我們可以得到:

\[j(2n+1)=2j(n)+1

\]綜合以上內容,我們可以得到下面的式子:

\[j(1)=1

\]\[j(2n)=2j(n)-1

\]\[j(2n+1)=2j(n)+1

\]有了這個式子,我們就可以快速計算j(n)了。但是我們還是不滿足,遞迴式算起來還是太麻煩,有沒有更好的方法呢?

我們在觀察上面的表,有沒有發現什麼呢?

1,1,3,1,3,5,7,1,3...

1,1,3,1,3,5,7,1,3,5,7,9,11,13,15,1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,1!

好像。。按2的冪次分組,然後每乙個都是前乙個加二!

\[j(n)=2l+1 \ ,\ n=2^m+l \ , \ l\in[0,2^m)

\]可以歸納一下:

首先,1很明顯符合該性質。

現在假設前i-1符合這個性質,那麼

如果i為偶數,則:

\[j(n)=2j(\frac)-1=2(2\frac+1)-1=2l+1\ ,\ n=2^m+l \ , \ l\in[0,2^m)

\]如果i為奇數,則:

\[j(n)=2j(\frac)+1=2(2\frac+1)+1=2l+1\ ,\ n=2^m+l \ , \ l\in[0,2^m)

\]證畢。

還有什麼性質嗎?

不妨從二進位制的眼光來看一看這個問題:

\(n=(1b_\cdots b_1b_0)_2\)

\(2^m=(10\cdots 00)_2\)

\(l=(0b_\cdots b_1b_0)_2\)

\(j(n)=2l+1=(b_\cdots b_1b_01)_2\)

j(n)是n迴圈左移了一位!

約瑟夫問題講完了,還有嗎?

當然還有了,你沒看見題目嗎?

一類特殊的遞迴式

雖然我們成功的解決了約瑟夫問題的一種簡單形式,並能夠在\(o(1)\)(m確定)或\(o(loglogn)\)(m不確定)的時間複雜度內解決,但是我們還遠遠沒有滿足。不妨再來看看這個遞迴式:

\[j(1)=1

\]\[j(2*n)=2j(n)-1

\]\[j(2*n+1)=2j(n)+1

\]太特殊了,我們來看看這個:

\[f(1)=\alpha

\]\[f(2*n)=2f(n)+\beta

\]\[f(2*n+1)=2f(n)+\gamma

\]容易看出,前面的就是\(\alpha =1,\beta =-1 ,\gamma =1\)的特殊情況。怎麼辦?

當然還是打表了。

nf(n)

1\(\alpha\)

2\(2\alpha +\ \beta\)

3\(2\alpha \ \ \ \ \ \ \ \ + \gamma\)

4\(4\alpha + 3\beta\)

5\(4\alpha+2\beta+\gamma\)

6\(4\alpha+\ \beta+2\gamma\)

7\(4\alpha\ \ \ \ \ \ \ \ +3\gamma\)

8\(8\alpha+7\beta\)

9\(8\alpha+6\beta+\gamma\)

\(\cdots\)

\(\cdots\)

有了上面的經驗,這次就簡單一點了。

首先按二的冪次分組,然後大力猜結論。

我們設\(f(n)=a(n)\alpha+b(n)\beta+c(n)\gamma\),剩下的就是求出來\(a(n),b(n),c(n)\)。

當然,我們還是可以歸納,但是在這裡,我們可以用一些更簡單的方法:

我們令\(\alpha =1,\beta=0,\gamma=0\),那麼原遞迴式就變成了

\[f(1)=1

\]\[f(2*n)=2f(n)

\]\[f(2*n+1)=2f(n)

\]易知,\(f(n)=2^m ,n=2^m+l,l\in[0,2^m)\)

又\(f(n)=a(n)\)

所以\(a(n)=2^m\)

然後我們令\(f(n)=1\)得

\[1=\alpha

\]\[1=2*1+\beta

\]\[1=2*1+\gamma

\]解得\(\alpha=1,\beta=-1,\gamma=-1\)

所以\(f(n)=a(n)-b(n)-c(n)=1\)

令\(f(n)=n\)得

\[1=\alpha

\]\[2n=2n+\beta

\]\[2n+1=2n+\gamma

\]解得\(\alpha=1,\beta=0,\gamma=1\)

於是得到方程:\(a(n)+c(n)=n\)

所以:\[\left \\\

a(n)&=2^m\\

a(n)-b(n)-c(n)&=1\\

a(n)+c(n)&=n

\end

\right .

\]解得:

\[a(n)=2^m,b(n)=2^m-l-1,c(n)=l

\]小總結:解遞迴式時可以帶入幾個比較特殊的數或者是函式,來幫助我們計算,可以減少我們找規律然後再歸納的時間。

這樣就行了?

當然不行。

上面我們找到了關於2進製的性質,那麼現在有沒有呢?

當然有了,為什麼沒有呢。

我們設\(\beta_0=\beta,\beta_1=\gamma\),帶到原遞迴式裡看一看吧。。

\[\begin\\

f((b_mb_\cdots b_1b_0)_2)&=2f((b_mb_\cdots b_1)_2)+\beta_\\

&=4f((b_mb_\cdots b_2)_2)+2\beta_+\beta_\\

&=\cdots\\

&=2^m\alpha+2^\beta_}+\cdots+2\beta_+\beta_

\end

\]如果2進製位裡面不止可以填01的話,那就相當於:

\[f((b_mb_\cdots b_1b_0)_2)=(\alpha\beta_}\cdots\beta_\beta_)_2

\]這樣還不夠,這並不是我們的一類遞迴式。真正的遞迴式在下面:

\[f(i)=\alpha_i ,i\in[1,c)

\]\[f(cn+i)=df(n)+\beta_i,i\in[1,c)

\]這個跟上面的是差不多的。直接扔結論:

\[f((b_mb_\cdots b_1b_0)_c)=(\alpha_\beta_}\cdots\beta_\beta_)_d

\]現在差不多了。我才不會告訴你我就會這些。

例題:有遞迴式:

\[\begin\\

f(1)&=34\\

f(2)&=5\\

f(3n)&=10f(n)+76,\\

f(3n+1)&=10f(n)-2\\

f(3n+2)&=10f(n)+8\\

\end

\]求f(17)

特殊情況下的一類約瑟夫問題

題幹資料全是隨機生成的,顯然可以暴力日過去。from oi wiki 考慮到我們每次走 k 個刪乙個,那麼在一圈以內我們可以刪掉 lfloor frac rfloor 個,然後剩下了 n lfloor frac rfloor 個人。這時我們在第 lfloor frac rfloor times k ...

類方法中的一類特殊方法 構造方法。

書寫方法的格式 修飾符返回值方法名呼叫過程中方法體 可能出現的例外 public int void addnumber 引數 throw excepion 例 public int addnumber int a,int b 注 方法名中的引數int a,int b為區域性變數 構造方法是當用類生成...

Integer一類的比較問題

總體主要分為兩個方面 比較的是值 一 基本資料型別與引用資料型別進行比較時,引用資料型別會進行拆箱 自動拆裝箱需要在jdk1.5以上 然後與基本資料型別進行值的比較 舉例 int i 12 integer j new integer 12 i j 返回的是true 二 引用資料型別與基本資料型別進行...