康托展开和康托逆展开

原创 2015年07月09日 18:36:38

康托展开

X=a[n](n-1)!+a[n-1](n-2)!+…+a[i]*(i-1)!+…+a[1]*0!
其中,a[i]为整数,并且X=a[n](n-1)!+a[n-1](n-2)!+…+a[i]*(i-1)!+…+a[1]*0!。这就是康托展开。

举个例子

1324是{1,2,3,4}排列数中第几个大的数:第一位是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是第三个大数。

//获取阶层
void getKt(){
    fac[0] = 1;
    for (int i = 1; i < 12; i++){
        fac[i] = i*fac[i-1];
    }
}
//s为一个数组,n为数组的长度
int Kt(int s[],int n){
    int sum, i, j, cnt;
    sum = 0;
    for (i = 0; i < n; i++){
        cnt = 0;
        for (j = i + 1; j < n; j++){
            if (s[j]<s[i]) cnt++;
        }
        sum += cnt*fac[n-i-1];
    }
    return sum;
}

康托展开的逆运算

  例 {1,2,3,4,5}的全排列,并且已经从小到大排序完毕

  (1)找出第96个数

  首先用96-1得到95

  用95去除4! 得到3余23

  用23去除3! 得到3余5

  用5去除2!得到2余1

  用1去除1!得到1余0有3个数比它小的数是4

  所以第一位是4

  有3个数比它小的数是4但4已经在之前出现过了所以是5(因为4在之前出现过了所以实际比5小的数是3个)

  有2个数比它小的数是3

  有1个数比它小的数是2

  最后一个数只能是1

  所以这个数是45321

  (2)找出第16个数

  首先用16-1得到15

  用15去除4!得到0余15

  用15去除3!得到2余3

  用3去除2!得到1余1

  用1去除1!得到1余0

  有0个数比它小的数是1

  有2个数比它小的数是3 但由于1已经在之前出现过了所以是4(因为1在之前出现过了所以实际比4小的数是2)

  有1个数比它小的数是2 但由于1已经在之前出现过了所以是3(因为1在之前出现过了所以实际比3小的数是1)

  有1个数比它小得数是2 但由于1,3,4已经在之前出现过了所以是5(因为1,3,4在之前出现过了所以实际比5小的数是1)

  最后一个数只能是2

  所以这个数是14352
  

int des[12];    //标记是否在数组中存在
int* ReKt(int s,int n){
    //初始化
    memset(des, false, sizeof(des));
    int temp,i,j;
    int *b = new int[n];

    s -= 1;

    for (i = 0; i < n; i++){
        temp = s/fac[n - i - 1];
        for (j = 1; j <= n; j++){
            if (des[j]!=false){
                continue;
            }
            if (temp == 0) break;
            temp--;

        }
        b[i] = j;
        des[j] = true;
        s = s % fac[n - i - 1];
    }

    return b;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

筛选法求素数和康托展开

筛选法求素数:不说直接上代码: #include #include #include #include #define MAXN 10000005 bool p[MAXN]; int mai...

康托展开和康托逆展开

康托展开   康托展开的公式是 X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,ai为当前未出现的元素中是排在第几个(从0开始)...

逆康托展开

简单介绍下:这个方法还是用例子来说比较好例1 {1,2,3,4,5}的全排列,并且已经从小到大排序完毕(1)找出第96个数首先用96-1得到95用95去除4! 得到3余23用23去除3! 得到3余5用...

LightOJ 1060 - nth Permutation (逆康托展开的思想)

题意: 求n<=20长度串的所有排列的按照字典序的第k个序列求n<=20长度串的所有排列的按照字典序的第k个序列 分析: 总排列数f=n!/(cnta!∗cntb!∗⋯∗cntz!)总排列数f...
  • lwt36
  • lwt36
  • 2015-11-21 04:17
  • 287

全排列的编码与解码——康托展开及其逆展开

一、康托展开:全排列到一个自然数的双射   X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0!   ai为整数,并且0<=ai<i(...

康托逆展开式

关于康托展开式的问题我已经在第一篇文章提到了,需要的朋友可以点进去看看。 ACM题目之排列序数 康托逆展开式就是给你一个数组,然后让你求出其全排列第n大的序列. 这里借用百度百科给的大家解释下 ...

HDU 1027 Ignatius and the Princess II [康托逆展开]【数学】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1027——————————————–.Ignatius and the Princess IITime ...

poj 3187 (康托逆展开)

利用康托逆展开得到从1至n的全排列,然后验证是否为答案即可,水题。       代码如下: #include #include #include #include #include #i...

hdoj 1027 Ignatius and the Princess II 【逆康托展开】

Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

小sugar呀——康托展开与逆展开

南阳理工学院**NYOJ139**题
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)