康托展开式---我排第几+逆康托展开
之前一直不想看這個(gè)康托展開定理因?yàn)檎娴暮懿焕斫?#xff0c;但是現(xiàn)在還是勇敢的面對(duì)了~
?{1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按從小到大排列一共6個(gè)。123 132 213 231 312 321 。 代表的數(shù)字 1 2 3 4 5 6 也就是把10進(jìn)制數(shù)與一個(gè)排列對(duì)應(yīng)起來。 他們間的對(duì)應(yīng)關(guān)系可由康托展開來找到。 如我想知道321是{1,2,3}中第幾個(gè)大的數(shù)可以這樣考慮 : 第一位是3,當(dāng)?shù)谝晃坏臄?shù)小于3時(shí),那排列數(shù)小于321 如 123、 213 ,小于3的數(shù)有1、2 。所以有2*2!個(gè)。再看小于第二位2的:小于2的數(shù)只有一個(gè)就是1 ,所以有1*1!=1 所以小于321的{1,2,3}排列數(shù)有2*2!+1*1!=5個(gè)。所以321是第6個(gè)大的數(shù)。 2*2!+1*1!+0*0!就是康托展開。 再舉個(gè)例子:1324是{1,2,3,4}排列數(shù)中第幾個(gè)大的數(shù):第一位是1小于1的數(shù)沒有,是0個(gè) 0*3! 第二位是3小于3的數(shù)有1和2,但1已經(jīng)在第一位了,所以只有一個(gè)數(shù)2 1*2! 。第三位是2小于2的數(shù)是1,但1在第一位,所以有0個(gè)數(shù) 0*1! ,所以比1324小的排列有0*3!+1*2!+0*1!=2個(gè),1324是第三個(gè)大數(shù)。 把一個(gè)整數(shù)X展開成如下形式: ? ?X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[2]*1!+a[1]*0! ? ?其中,a為整數(shù),并且0<=a[i]<i(1<=i<=n) #include<stdio.h> #include<string.h>int a[14];char s[15];void factorial(){int i;a[0]=1;a[1]=1;for(i=2;i<14;i++)a[i]=i*a[i-1];}int cator(){factorial();// puts("++");int i,j,ans=0,cout ;for(i=0;i<12;i++){ cout=0;for(j=i+1;j<12;j++){if(s[i]>s[j])cout++;}ans+=cout*a[11-i];}return ans+1;}int main(){int ncase;scanf("%d",&ncase);while(ncase--){scanf("%s",s);printf("%d\n",cator());}return 0;}
二、康托展開的逆運(yùn)算
點(diǎn)擊打開鏈接
例1 {1,2,3,4,5}的全排列,并且已經(jīng)從小到大排序完畢
(1)找出第96個(gè)數(shù)
首先用96-1得到95
用95去除4! 得到3余23
用23去除3! 得到3余5
用5去除2!得到2余1
用1去除1!得到1余0
有3個(gè)數(shù)比它小的數(shù)是4
所以第一位是4
有3個(gè)數(shù)比它小的數(shù)是4但4已經(jīng)在之前出現(xiàn)過了所以是5(因?yàn)?在之前出現(xiàn)過了所以實(shí)際比5小的數(shù)是3個(gè))
有2個(gè)數(shù)比它小的數(shù)是3
有1個(gè)數(shù)比它小的數(shù)是2
最后一個(gè)數(shù)只能是1
所以這個(gè)數(shù)是45321
(2)找出第16個(gè)數(shù)
首先用16-1得到15
用15去除4!得到0余15
用15去除3!得到2余3
用3去除2!得到1余1
用1去除1!得到1余0
有0個(gè)數(shù)比它小的數(shù)是1
有2個(gè)數(shù)比它小的數(shù)是3 但由于1已經(jīng)在之前出現(xiàn)過了所以是4(因?yàn)?在之前出現(xiàn)過了所以實(shí)際比4小的數(shù)是2)
有1個(gè)數(shù)比它小的數(shù)是2 但由于1已經(jīng)在之前出現(xiàn)過了所以是3(因?yàn)?在之前出現(xiàn)過了所以實(shí)際比3小的數(shù)是1)
有1個(gè)數(shù)比它小得數(shù)是2 但由于1,3,4已經(jīng)在之前出現(xiàn)過了所以是5(因?yàn)?,3,4在之前出現(xiàn)過了所以實(shí)際比5小的數(shù)是1)
最后一個(gè)數(shù)只能是2
所以這個(gè)數(shù)是14352
總結(jié)
以上是生活随笔為你收集整理的康托展开式---我排第几+逆康托展开的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: noj一道简单的数学题
- 下一篇: kmp——next数组的应用---cou