約瑟夫問題小結


前前后后做過三道關於約瑟夫問題的題了。然而今天這次考試讓我認識到其實我並沒有完全理解約瑟夫問題的解法。

今天花了大概一個多小時的時間徹底弄明白了(可能是我太垃圾,用的時間還是太長了),以后如果再考約瑟夫應該不會掛了吧。。。

約瑟夫游戲(題目大意:經典約瑟夫問題,要求輸出出圈順序,數據范圍$30000$)

這道題目是初學OI那段時間寫的??碼風還沒成型。$O(n^2)$暴掃即可。

約瑟夫問題二(題目大意:經典約瑟夫問題,要求輸出獲勝者編號,數據范圍$1e8$)

我們將一個還剩下$n$個人的約瑟夫問題成為一個n階問題。

對於一個n階問題,我們給所有成員依次編號為$0,1,2...n-1$,

即$0$號要報$"1"$,$1$號要報$"2"$,以此類推,本輪游戲的出局者一定是編號為$(m-1)%n$的人。

從$n$階問題到$n-1$階問題,部分人的編號將發生改變。根據命名規則,編號為$(m-1)%n+1$的人將被命名為$0$。

此時設第$i$個人在$n-1$階問題中的編號為$f_i$,在n階問題中的編號為$g_i$,則可由$f_i$推得$g_i$:$g_i=(f_i+m)%n$。

解釋:如右圖:對於每一階問題中,一個人的編號還可以表示在他前面報數的人數。對於$n-1$階問題,$i$的前面有$f_i$個人。本階問題的$0$號在上一階問題中一定在出局者后面。我們假設$n$足夠大。則本階的$0$號在上一階前面一定有$m$個人。此時,$g_i=(f_i+m)%n$。模$n$意義下同理。

此時我們得到了由$n-1$階問題推向$n$階問題的一般公式。而我們還知道,在第1階問題的幸存者必定被編號為$0$。於是我們就可以$O(n)$推導出這名幸存者在第一輪,即第$n$階問題中的編號是多少,此時即為所求答案。

One(題目大意:約瑟夫問題改編版:第i輪報"i"者出局,求獲勝者編號,數據范圍$1e7$)

第i輪報"i"者出局,將式子$g_i=(f_i+m)$中的$m$替換為$n-i+1$即可。

嘟嘟嚕(題目大意:經典約瑟夫問題,數據范圍$n \leqslant 1e9,m \leqslant 1e5$)

數據范圍$1e9$,$O(n)$遞推會$T$掉。考慮加速我們剛才的過程。觀察數據范圍可以發現,$m$遠小於$n$。

此時的倒序推導過程可以跳步實現。對於一個$i$階問題,$i$遠大於$m$時,可以直接跳到第$i+k$輪求解。

$k=min((i-1-ans)/m+1,n-i+1)$(在這個式子中我們取剩下$i-1$個人為第i輪翻轉)

解釋:$i-1$為邊界。(這里我們沒有必要預估跳了$k$步后的邊界。對於當前邊界求解即可。)$ans$為當前幸存者的編號。

$i-1-ans$是邊界到$ans$的距離,除以m即為出局位置移動到邊界所需步數。$+1$為翻過邊界進入下一層的那一步。

$i$也是輪數,$n-i+1$為我還需要的輪數。(肯定不能還原到$n+1$個人的時候吧……)

時間復雜度……大概接近$O(mlogn)$??


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM