參考鏈結
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 個元素的乙個排列,計算出這個排列的字典序值,以及按...