康托展開 全排列的本質

2021-09-26 11:09:12 字數 1136 閱讀 4979

參考鏈結

x=a[n]* (n-1)!+a[n-1] * (n-2)!+…+a[i] * (i-1)!+…+a[1]*0!

1.求乙個排列是原排列的按字典序的第幾個排列。

#include

#include

using namespace std;

int fac=

;// 階乘

intcantor

(int

*a,int n)

x += fac[n - i -1]

* smaller;

// 康托展開累加

}return x;

// 康托展開值

}

2.求序列的第n個全排列。

例:求12345的第16個全排列。

計算方法:

求第一位 用15/4!=0餘15,那麼前面有0個數,得到1。那麼此時12345剩下了2345。

求第二位 用餘的15/3! = 2餘3,那麼前面有2個數,得到4。剩下235。

求第三位 用餘的3/2! = 1餘1,那麼前面有1個數,得到3,剩下25。

求第四位 用餘的1/1! = 1餘0,那麼前面有1個數,得到5,剩下2。

求第五位 即2。

原理:以1開頭的全排列是第(1, 4!);

以2開頭的全排列是第(4! + 1, 2 * 4!);

以3開頭的全排列是第(2 *4! + 1, 3 *4!);

以4開頭的全排列是第(3 *4! + 1, 4 *4!);

以5開頭的全排列是第(4 *4! + 1, 5 *4!);

再細分一下,以21開頭的全排列在(4! + 1, 4! + 3!);

以23開頭的全排列在(4! + 3! + 1, 4! + 2 * 3!);

以24開頭的全排列在(4! + 2 *3! +1, 4! + 3 *3!);

以25開頭的全排列在(4! + 3 *3! + 1, 4! + 4!);

求12345的第16個全排列就是確定每個位置的數。

規律就是先16-1,

15/4! = 0餘15 即第乙個區間的第15個,12345的第乙個數1;

15/3! = 2餘3 即剩下的數的2345的第三個數4;

3/2! = 1餘1。。。。。

康托展開 全排列

今天找到了一篇非常好的介紹康托展開的文章!其核心是這一張圖 letter 儲存所需字母表 void initletter 初始化字母表 int fact int n 階乘 return result void output vector v 輸出生成的結果 cout endl void divisi...

康托展開 全排列

對於n個數的全排列,共有n!中排列方式,如何求某乙個序列在整個排列中的次序 從小到大 以9的全排枚舉例 842697513是1 9全排列的第幾個?高中數學排列組合問題,只需要做到不重不漏 首先看第一位為8,那麼第一位為1 7的全排列都比它小,共有7 8!個。在第一位為8的情況下,其次看第二位為4,那...

全排列康托展開

n個元素有n 個不同的排列。將這n 個排列按字典序排列,並編號為0,1,n 1。每個排列的編號為其字典序值。例如,當n 3時,6 個不同排列的字典序值如下 0 1 2 3 4 5 123 132 213 231 312 321 任務 給定n 以及n 個元素的乙個排列,計算出這個排列的字典序值,以及按...