對康託展開的一些心得

2022-03-13 17:28:45 字數 1473 閱讀 5728

康托展開: 對於全排列中形成的乙個陣列,可以知道他是排列中的第幾種...具體公式為:

x=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0!其中,a為整數陣列,並且0<=ai一下是一些**....

比如表示1,2,3,...,n的排列如 按從小到大排列一共6個。123 132 213 231 312 321 。

代表的數字 1 2 3 4 5 6 也就是把10進製數與乙個排列對應起來。

他們間的對應關係可由康托展開來找到。

如我想知道321是中第幾個大的數可以這樣考慮 :

第一位是3,當第一位的數小於3時,那排列數小於321 如 123、 213 ,小於3的數有1、2 。所以有2*2!個。再看小於第二位2的:小於2的數只有乙個就是1 ,所以有1*1!=1 所以小於321的排列數有2*2!+1*1!=5個。所以321是第6個大的數。 2*2!+1*1!+0*0!就是康托展開。

再舉個例子:1324是排列數中第幾個大的數:第一位是1小於1的數沒有,是0個 0*3! 第二位是3小於3的數有1和2,但1已經在第一位了,所以只有乙個數2 1*2! 。第三位是2小於2的數是1,但1在第一位,所以有0個數 0*1! ,所以比1324小的排列有0*3!+1*2!+0*1!=2個,1324是第三個大數。

時間限制:1000 ms  |  記憶體限制:65535 kb

難度:3

描述現在有"abcdefghijkl」12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?

輸入第一行有乙個整數n(0

輸出輸出乙個整數m,佔一行,m表示排列是第幾位;

樣例輸入

3

abcdefghijkl

hgebkflacdji

gfkedhjblcia

樣例輸出

1

302715242

260726926

**

[苗棟棟]原創

上傳者苗棟棟

**:

1 #include2 #include3

using

namespace

std;

4int

main()

5,t,i,j,count;

7long

long

sum;

8for(i=1;i<12;i++) //

算出【1~12】內的階乘

9 arr[i]=arr[i-1]*i;

10char str[13

];11 cin>>t;

12while(t--)

1324 sum+=count*arr[11-i];25}

26 cout<1

<

28return0;

29 }

view code

康托展開 康托逆展開 的寫法

康托展開 康托展開解決的是當前序列在全排序的名次的問題。例如有五個數字組成的數列 1,2,3,4,5 那麼1,2,3,4,5就是全排列的第0個 注意從0開始計數 1,2,3,5,4就是第1個 1,2,5,3,4就是第2個 給定乙個序列,怎麼確定它的排名呢?就用到了這樣乙個公式x a n n 1 a ...

康托展開與康托展開的逆運算

康托展開用來求陣列是該全排列的第幾項,康托展開的逆運用用於求全排列的第幾個排列。已知對於1 n個數的全排列,總共的可能是n 種。對於乙個已知的數列比如45321,在第一項是4時,表示第一項在此之前已經填放過1 2 3了,而後面的第二項至第五項則又是乙個全排列,那麼此時的排列數就是3 4 第二位是5,...

康托展開和逆康托展開的實現

表示1,2,3,n的排列如 按從小到大排列一共6個。123 132 213 231 312 321 代表的數字 1 2 3 4 5 6 也就是把10進製數與乙個排列對應起來。他們間的對應關係可由康托展開來找到。如我想知道321是中第幾個大的數可以這樣考慮 第一位是3,當第一位的數小於3時,那排列數小...