主定理

對於一個遞推關係式子:T(n)=aT(nb)+f(n)T(n) = aT(\frac{n}{b}) + f(n)。其複雜度為:

參考維基百科,與演算法導論對應章節。

其實就是找 aT(nb)aT(\frac{n}{b})f(n)f(n) 兩個部分複雜度較大的。

複雜度記號

poly(n)\mathrm{poly}(n) 指和 nn 有關的多項式,同理 polylog(n)\mathrm{polylog}(n) 實際上就是 poly(logn)\mathrm{poly}(\log n),即和 logn\log n 有關的多項式。

錯排問題

考慮容斥,若存在 ii 個數在原來的位置上,這種情況的數量是 (ni)(ni)!\binom{n}{i}(n-i)!,所以可以得到錯排公式:

D(n)=i=0n(1)i(ni)(ni)!=i=0n(1)in!i!=n!i=0n(1)ii!\begin{aligned} D(n) &= \sum_{i=0}^{n} (-1)^{i} \binom{n}{i}(n-i)! \\ &= \sum_{i=0}^{n} (-1)^{i} \frac{n!}{i!} \\ &= n! \sum_{i=0}^{n} \frac{(-1)^{i}}{i!} \end{aligned}

也可以考慮遞推,對於第 nn 個數,假設它被放到位置 ii 構成錯排,考慮第 ii 個數的位置:

故得到遞推公式:D(n)=(n1)[D(n1)+D(n2)]D(n)=(n-1)[D(n-1)+D(n-2)]

OEIS: A000166

卡特蘭數

從最經典的出棧序列計數開始。將入棧記作 -1,出棧記作 +1,可以得到一個長度為 2n 的序列,一個合法的出棧序列滿足其任意一個字首和非負,且總和為 0。

考慮統計不合法的出棧序列。對於任意一個不合法的出棧序列,找到第一個滿足字首和等於 -1,的位置 p,將 p 之前的所有數翻轉,即 -1 變為 +1,+1 變為 -1,得到一個長度為 2n 且有 n+1 個 +1,n-1 個 -1 的序列。容易得到對於任意一個有 n+1 個 +1,n-1 個 -1 的序列都能對應一個不合法的出棧序列,這是個雙射。故不合法序列的總數為 (2nn+1)\binom{2n}{n+1},總共合法序列的數量為 (2nn)(2nn+1)=(2nn)n+1\binom{2n}{n} - \binom{2n}{n+1} =\frac{\binom{2n}{n}}{n+1}

OEIS: A000108

Twelvefold way

nn 個球,xx 個盒子。

nn 個有標號球放入 xx 個有標號盒子

xnx^{n}

nn 個有標號球放入 xx 個有標號盒子,每個盒子至多一個球

xnx^{\underline n}

nn 個有標號球放入 xx 個有標號盒子,每個盒子至少一個球

x!{nx}x! \begin{Bmatrix} n \\ x \end{Bmatrix}

第二類斯特林數統計的是不區分盒子時的數量,乘上 x!x! 表示考慮 xx 個盒子的順序。

nn 個無標號球放入 xx 個有標號盒子

(n+x1x1)\binom{n+x-1}{x-1}

每個盒子預先放上一個球,即轉化為 n+xn+x 個無標號球放入 xx 個有標號盒子,每個盒子至少一個球。

nn 個無標號球放入 xx 個有標號盒子,每個盒子至多一個球

(xn)\binom{x}{n}

考慮哪些盒子放了球。

nn 個無標號球放入 xx 個有標號盒子,每個盒子至少一個球

(n1x1)\binom{n-1}{x-1}

插板法,考慮 nn 個球之間有 n1n-1 個空位,在這些空位中插入 x1x-1 個分隔。

nn 個有標號球放入 xx 個無標號盒子

i=0k{ni}\sum_{i=0}^{k} \begin{Bmatrix} n \\ i \end{Bmatrix}

盒子是可空的,所以列舉有多少個盒子空,轉化為每個盒子至少一個球的問題。

nn 個有標號球放入 xx 個無標號盒子,每個盒子至多一個球

[nx][n \le x]

nn 個有標號球放入 xx 個無標號盒子,每個盒子至少一個球

{nx}\begin{Bmatrix} n \\ x \end{Bmatrix}

第二類斯特林數就是這樣定義的。

計算第二類斯特林數,有遞推公式:

{nx}={n1x1}+x{n1x}\begin{Bmatrix} n \\ x \end{Bmatrix} = \begin{Bmatrix} n-1 \\ x-1 \end{Bmatrix} + x \begin{Bmatrix} n-1 \\ x \end{Bmatrix}

考慮第 nn 個球應該放在哪裡。如果它單獨放一個盒子,那麼就是轉化為 {n1x1}\begin{Bmatrix} n-1 \\ x-1\end{Bmatrix};如果它放入一個現有的非空盒子,那麼就是 x{n1x}x\begin{Bmatrix} n-1 \\ x \end{Bmatrix}

nn 個無標號球放入 xx 個無標號盒子

px(n+x)p_{x}(n+x)

每個盒子預先放上一個球,即轉化為 n+xn+x 個無標號球放入 xx 個有標號盒子,每個盒子至少一個球。

nn 個無標號球放入 xx 個無標號盒子,每個盒子至多一個球

[nx][n \le x]

nn 個無標號球放入 xx 個無標號盒子,每個盒子至少一個球

px(n)p_{x}(n)

相當於將 nn 拆分成恰好 xx 個正整數的方案數。

計算 px(n)p_{x}(n),有轉移方程:

px(n)=px(nx)+px1(n1)p_{x}(n) = p_{x}(n-x) + p_{x-1}(n-1)

即考慮拆分方案中不存在 11 和存在 11 的情況。如果不存在 11,那麼把方案中所有數減一,轉化為 px(nx)p_{x}(n-x);如果存在 11,那麼去掉這個 11,轉化為 px1(n1)p_{x-1} (n-1)

命令

就列一些常用的。我非常反感考這種東西。

歷史

2023 年,第 40 屆 NOI,第 29 屆 NOIp,第 35 屆 IOI,第 5 屆 CSP。

ASCII

哈夫曼樹

  1. 對於給定的 nn 個權值,先建立 nn 個有 11 個節點的樹。
  2. 不斷進行以下操作,直到剩下 11 棵樹:
    1. 選取權值最小的兩棵樹 AABB,將他們分別為左右子樹,構造一顆新的樹,其權值為 AA 的權值加 BB 的權值。
    2. 刪除 AABB

補碼

對於一個長度為 nn 的二進位制數 xx,其補碼為 xmod2nx \bmod 2^n