「学习笔记」欧拉数
定義
記一個(gè)排列 (P) 的升高為 (k) 當(dāng)且僅當(dāng)存在 (k) 個(gè)位置 (i) 使得 (P_i<P_{i+1})。
那么定義歐拉數(shù) (leftlangleegin{matrix}n\kend{matrix}ightangle) 表示長(zhǎng)度為 (n) 且有 (k) 個(gè)上升的排列的數(shù)量。
遞推式
通過(guò)討論 (n) 在最左邊,最右邊還是中間可以得出轉(zhuǎn)移:
[leftlangleegin{matrix}n\kend{matrix}ightangle = (k + 1)leftlangleegin{matrix}n - 1\kend{matrix}ightangle + (n - k) leftlangleegin{matrix}n - 1\k - 1end{matrix}ightangle
]
計(jì)算
高妙的組合意義
考慮計(jì)算 (leftlangleegin{matrix}n\kend{matrix}ightangle / n!) 也就是概率,可以發(fā)現(xiàn),對(duì)于 (n) 個(gè)實(shí)數(shù)的均勻分布 ((a_1, a_2, cdots, a_n) in (0, 1)^n) 產(chǎn)生和排列 (P) 相同的偏序關(guān)系的概率是 (frac 1{n!}),這樣我們就可以將問(wèn)題轉(zhuǎn)化為 (a_i < a_{i + 1}) 有 (k) 個(gè)的概率。
將 (a) 進(jìn)行差分,定義 (a_0 = 0, b_i = (a_i - a_{i - 1}) mod 1),顯然 (b_i in (0, 1))。
考慮 (b_i) 的實(shí)際意義,發(fā)現(xiàn)當(dāng) (a_{i - 1} < a_i) 時(shí),(b_i = a_i - a_{i - 1}),否則 (b_i = 1 + a_i - a_{i - 1}),而 (a_{i - 1} < a_{i}) 有 (k + 1) 個(gè)((a_0 = 0)),所以說(shuō) (sum b_i = n - k - 1 + a_n in (n - k - 1, n - k))。這樣,問(wèn)題就變?yōu)榱私o定 (n) 個(gè) ((0, 1)) 之間的實(shí)數(shù) (x_1, x_2, cdots, x_n),求滿足 (sum x_i in (n - k - 1, n - k)) 的概率,可以轉(zhuǎn)化為 (sum x_i < n - k) 的概率然后差分,設(shè)其為 (F(n - k))。
使用幾何概型,由于樣本空間的“體積”是 (1),所以答案就是滿足條件的區(qū)域的“體積”。
設(shè) (G(k)) 表示 (n) 個(gè)隨機(jī)變量沒(méi)有限制的情況下的滿足 (sum x_i < k) 的區(qū)域的“體積”。
考慮容斥有多少個(gè) (x_i > 1),能夠列出式子:
[F(k) = sum_{i = 0}^k (-1)^i inom ni G(k - i)
]
接下來(lái)只需要知道如何計(jì)算 (G(k)) 即可。
將 (n) 個(gè)變量做前綴和,設(shè)為 (t_i),那么只需要滿足 (t_i < t_{i + 1}) 且 (t_n < k) 的條件即可,由最開(kāi)始的性質(zhì),可以將其對(duì)應(yīng)到排列上得出概率為 (frac 1 {n!})。又因?yàn)?(G(k)) 是“體積”,所以 (G(k) = frac {k^n}{n!}),即:
[F(k) = frac 1 {n!} sum_{i=0}^k (-1)^i inom ni (k - i)^n
]
于是 (leftlangleegin{matrix}n\kend{matrix}ightangle) 可以做到計(jì)算一個(gè) (mathcal O(n)),計(jì)算一行 (mathcal O(n log n))。
直接容斥
廣告
設(shè) (F(n, k)) 表示長(zhǎng)度為 (n) 的排列,欽定有 (k) 個(gè) < 的方案數(shù)。
考慮將 < 看成邊,那么排列中將會(huì)形成 (n - k) 個(gè)連通塊,而連通塊內(nèi)部必須有序,連通塊之間可以任意打亂順序,所以方案數(shù)就是 ((n - k)!egin{Bmatrix} n\n - k end{Bmatrix})。
由二項(xiàng)式反演:
[egin{aligned}
leftlangleegin{matrix}n\kend{matrix}ightangle &= sum_{i = k}^n (-1)^{i - k} inom ik (n - i)!egin{Bmatrix} n\n - i end{Bmatrix}\
&=sum_{i = k}^n (-1)^{i - k} inom ik sum_{j = 0}^{n - i} inom{n - i} j (-1)^{n - i - j} j^n\
&=sum_{j = 0}^{n - k} j^n (-1)^{n - k - j} sum_{i} inom ik inom {n - i}j\
&= sum_{j = 0}^{n - k} (-1)^{n - k - j} j^n inom {n + 1} {k + j + 1}
end{aligned}
]
解釋一下最后一步吧,由于 (inom ik = [x^{i - k}] frac 1{(1 - x)^{k + 1}}, inom {n - i}j = [x^{n - i - j}] frac 1{(1 - x)^{j + 1}}),所以 (sum_i inom ik inom {n - i}j = [x^{n - j - k}] frac 1 {(1 - x)^{k + j + 2}} = inom {n + 1}{k + j + 1})。
同樣可以直接卷積求出一行歐拉數(shù)。
總結(jié)
- 上一篇: CMake快速入门教程
- 下一篇: 开发商如何解决房屋卖不出去的情况