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

2022-09-19 17:54:13 字數 2747 閱讀 2400

題幹資料全是隨機生成的,顯然可以暴力日過去。

from oi-wiki

考慮到我們每次走 \(k\) 個刪乙個,那麼在一圈以內我們可以刪掉 \(\lfloor \frac \rfloor\) 個,然後剩下了\(n - \lfloor \frac \rfloor\) 個人。這時我們在第 \(\lfloor \frac \rfloor \times k\) 個人的位置上。而你發現這個東西它等於 \(n - n \mod k\) 。於是我們繼續遞迴處理,算完後還原它的相對位置。

int josephus(int n, int k)
定義 \(j(n)\) 表示人數為 \(n\) 時倖存的編號。

先打個表

\(n\)12

3456

\(j(n)\)11

3135

顯然沒什麼規律。

但是看到題目的遞推標籤了嗎?

我們得到歸納法的基礎。(眾所周知歸納法有基礎和歸納兩部分,不會的自己去學)

\[\large

j(1) = 1

\]\(\alpha.\)

假設現在有 \(2n\) 人,對於第一輪:

出局的人編號為:\(2,4,6,8,\cdots ,2n\) 總計\(n\)人。

剩下的人編號為:\(1,3,5,7,\cdots,2n - 1\),總計\(n\)人。

現在任意的 \(j(2n)\) 情況等價於 \(j(n)\) 的情況。

考慮重編號:

\[\large

\begin

& 1,3,5,7,\cdots,2n - 1\\

&1,2,3,4,\cdots,n

\end

\]很像一次函式的關係,擬合計算可得

\(y = 2x-1\) 這樣乙個關係式。

於是可知\(j(n)\)的結果就是\(j(2n)\)一輪後重編號的結果

於是\[\large

j(2n) = 2j(n) - 1,n \ge 1

\]\(\beta.\)

假設現在有\(2n+1\)人,第二輪淘汰開始時正好把1號淘汰。

出局的人編號為:\(2,4,6,8,\cdots ,2n,1\)

剩下的人編號為:\(3,5,7,,9\cdots,2n + 1\)

可得關係式 \(y = 2x + 1\)

現在任意的 \(j(2n + 1)\) 情況等價於 \(j(n)\) 的情況。

於是\[\large

j(2n + 1) = 2j(n) + 1,n \ge 1

\]綜上,遞推式為

\[\large

\boxed

&j(1) = 1\\

&j(2n) = 2j(n) - 1,n \ge 1\\

&j(2n + 1) = 2j(n) + 1,n \ge 1

\end}\]

封閉形式

眾所周知給你遞推式就是用來解的,管你用什麼方法。

顯然第一次打**局小了,現在按照 \(2\) 的冪來分一下塊。

\(2^0\)

\(n\)

1\(2^0\)

\(j(n)\)

1\(2^1\)

\(n\)23

\(2^1\)

\(j(n)\)13

\(2^2\)

\(n\)45

67\(2^2\)

\(j(n)\)13

57\(2^3\)

\(n\)89

1011

1213

\(2^3\)

\(j(n)\)13

57911

顯然對於每一組內都有 \(f(t) = 2t + 1\)

定義 \(m \ge 0,l \in [0,2^m)\)

有\[\large

j(2^m + l) = 2l + 1

\]證明

基礎:\(m = 0,l = 0\) 時,\(j(2^0 + 0) = j(1) = 1\)

歸納:\(l = 0\) 時,\(j(n) = j(2^m + l) = j(2 ^ m) = 1\)

\[\large

\begin

j(2^m) & = 2j(2^ - 1) - 1\\

& = 2^2j(2^) - 3\\

& = 2^3j(2^) - 7\\

& = 2^mj(1) - 2^m + 1

\end

\]對於 \(2^m + l\) 為偶數時,

\[\large

\begin

j(2^m + l) & = 2j(2 ^ + \frac) - 1\\

& = 2(\frac + 1) - 1\\

& = 2l + 1

\end\]由

\[\large

\begin

\alpha.j(2n) &= 2j(n) - 1\\

\beta.j(2n + 1) &= 2j(n) + 1

\end

\]\(\alpha - \beta\) 得

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

於是對於奇數和偶數的 \(n\)

總是有:

\[\large

\boxed

m \ge 0,l \in [0,2^m) \\

j(2^m + l) = 2l + 1

\end}\]

然後使用跑得飛快的__builtin_clz()就能求 $\log $ 了。

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

前言 其實。本文和約瑟夫問題沒什麼關係。題目是吸引你點進來的。正文 約瑟夫問題 這個,大家應該都知道吧,不知道的可以看一看這個 下面是約瑟夫問題的乙個簡化版本 有n個人圍成乙個環,依次編號為1到n,然後1,2報數,報到2的人出列,求最後出列的人的編號。首先,我們打表找規律一下,規定j n 表示n個人...

類模板的使用 特殊情況友元函式

1 類內部宣告友元函式,必須寫成一下形式 template friend a adda a a,a b 2 友元函式實現 必須寫成 template typename t aadd a a,a b 3 友元函式呼叫 必須寫成 a int c4 adda int c1,c2 做不到,b再多也是白搭 練...

整理 mysql一些特殊情況的處理

由於某度眾所周知的舉動,讓我搬離寫了5年的渣度空間,準備把技術性的文章定在csdn了。這些都是文章備份。勿怪。做個筆記 聯合查詢時 想一次性查出全部字段,但是幾個表中有 同名字段 先用 來查出所有字段,然後用as重新命名相同字段。如下 select a.a.id as web id b.b.id a...