1. 程式人生 > >【康托展開】

【康托展開】

個數 -s span 我們 不同 body 是否 clas str

康托展開:

1.定義:給一個n個不同數字的排列,求所有排列中比該排列要小的個數X

2.式子:$X=a_n*(n-1)!+a_{n-1}*(n-2)!+……+a_1*0!$,其中$a_i$表示第1位到第i-1位上的數字中,比第i位(從右往左數)數字的個數小的數量。

3.例子:如 {1、2、3、4}的一個排列 {2、1、4、3}:

  X=1*3!+0*2!+1*1!+0*1!= 7。

逆康托展開

1.猜想:既然我們可以通過1-n的一個排列S,求出X(S),那麽是否給定一個X(S)可以求出S呢?

2.結論:可以。

  對於給定的X(S)我們第一次對(n-1)!取商和余,商即為$a_n$;

  第二次對讓第一次的余(n-2)!取商和和余,商即為$a_{n-1}$;

  ……

  求出$a$以後,我們對$a$進行反解,即X(S)

3.例子:X(S)=7

  X=1*3!+0*2!+1*1!+0*0!

  所以$a$={1、0、1、0},那麽$s_4=2$,$s_3=1$,$s_2=4$,$s_1=3$。

  反解成功。

【康托展開】