1. 程式人生 > 其它 >康託展開筆記

康託展開筆記

變進位制數

定義

所謂變進位制數,就是每一位進位制不一定相同的數,形式化的來講:
對於一個變進位制 \(A =\{a_1,a_2, a_3 ... a_n\}\) , \(a_i\) 表示第 \(i\) 位的一個 \(1\) 相當於第 \(i-1\) 位的一個 \(a_i\) .特別的, \(a_1 = 1\)

變進位制數轉十進位制數

就像 \(k\) 進位制數轉十進位制數一樣, 設變進位制數第 \(i\) 位是 \(b_i\), 那麼轉成十進位制就是 \(\sum_{i=1}^{n}b_i\prod_{j=1}^{i}a_j\)

十進位制數轉變進位制數

就像十進位制數轉 \(k\) 進位制數一樣, 設變進位制數第 \(i\)

位是 \(b_i\), 十進位制數為 \(d\), 那麼轉成變進位制就是 \(b_i = d 對從 n 到 i + 1 的每一個 a_i 取模, 再處以 a_i 的值下取整\)

康託展開

用於求一個排列的排名.
對於排列的每一位,分別考慮有多少排列之前位和這個排列一樣,這一位比這個排列小, 顯然這樣可以做到不重不漏
設排列是一個 \(1-n\) 的排列,對於排列的第 \(i\) 位,比它小的排列的數量就是 \(1-n\) 中第 \(i\) 位以及之前沒有出現的比第 \(i\) 位的數小的數的數量, 再乘上 \((n-i)!\)
就是先使這一位比原來小,後面幾位隨便排。
最後把答案加起來就行。
通過樹狀陣列維護比當前數小的沒有出現的數的數量可以優化到 \(O(n\lg n)\)