題幹資料全是隨機生成的,顯然可以暴力日過去。
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...