康托展开

康托展开解决的是当前序列在全排序的名次的问题。

例如有五个数字组成的数列: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[n-1]*(n-2)!+a[n-2]*(n-3)!+...+a[1]*0!

其中a[n]表示当前数是数列中未出现的数中第几小的【注意从0开始计数】

例如:对于序列3,2,5,4,1

对于3:比3小的有1、2,所以3是第2小的,X+=2*(5-1)!

对于2:比2小的有1,所以2是第1小的,X+=1*(4-1!)

对于5:比5小的有1、2、3、4,但由于2、3已经出现过了,所以目前5是第2小的,X+=2*(3-1)!

对于4:比4小的只剩1,所以X+=1*(2-1)!

对于1:已经是最小的,X+=0*(1-1)!

这样就求出了最后的排序啦!

为了节省时间,我们先预处理阶乘:

void cal(){
fac[0]=1;
for(int i=1;i<=9;i++) fac[i]=fac[i-1]*i;
}

然后就是康拓展开:

int kangtuo(int* a){
int ans=0;
for(int i=0;i<=n;i++) label[i]=1;
for(int i=0;i<n;i++){
int cnt=0;
for(int j=0;j<a[i];j++) if(label[j]) cnt++;
label[a[i]]=0;
ans+=cnt*fac[n-i-1];
}
return ans;
}

康托逆展开

康托逆展开就是知道排名,求出当前数列

首先,把排名转化为以0为开始的排名【就是自减1】

举个例子吧:

对于1,2,3,4,5,求第10的数列

10-1=9

第一个数:9/(5-1)!=0......9,所以第一个数是当前未出现的第0个数:1

第二个数:9/(4-1)!=1......3,所以第二个数是当前未出现的第1个数:3

第三个数:3/(3-1)!=1......1,所以第二个数是当前未出现的第1个数:4

第四个数:1/(2-1)!=1......0,所以第二个数是当前未出现的第1个数:5

第五个数:0/(1-1)!=0......0,所以第二个数是当前未出现的第0个数:2

就这样,第十数列就是1,3,4,5,2

void codel(int x){
int cnt;
for(int i=0;i<m;i++) label[i]=1;
for(int i=0;i<m;i++){
cnt=x/fac[m-1-i];
x=x%fac[m-1-i];
for(int j=0;j<m;j++){
if(!label[j]) continue;
if(!cnt) {label[j]=0;n[i]=j;break;}
cnt--;
}
}
}

康托展开&康托逆展开 的写法的更多相关文章

  1. HDU 1027 Ignatius and the Princess II(康托逆展开)

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

  2. 康托展开&&康托逆展开

    康托展开 简介:对于给定的一个排列,求它是第几个,比如54321是n=5时的第120个.(对于不是1~n的排列可以离散化理解) 做法: ans=a[n]*(n-1)!+a[n-1]*(n-2)!+~~ ...

  3. nyoj 139——我排第几个|| nyoj 143——第几是谁? 康托展开与逆康托展开

    讲解康托展开与逆康托展开.http://wenku.baidu.com/view/55ebccee4afe04a1b071deaf.html #include<bits/stdc++.h> ...

  4. 康托展开&逆展开算法笔记

    康托展开(有关全排列) 康托展开:已知一个排列,求这个排列在全排列中是第几个 康托展开逆运算:已知在全排列中排第几,求这个排列 定义: X=an(n-1)!+an-1(n-2)!+...+ai(i-1 ...

  5. 【数学】康托展开 && 康托逆展开

    (7.15)康托展开,就是把全排列转化为唯一对应自然数的算法.它可以建立1 - n的全排列与[1, n!]之间的自然数的双向映射. 1.康托展开: 尽管我并不清楚康托展开的原理何在,这个算法的过程还是 ...

  6. 康托展开+逆展开(Cantor expension)详解+优化

    康托展开 引入 康托展开(Cantor expansion)用于将排列转换为字典序的索引(逆展开则相反) 百度百科 维基百科 方法 假设我们要求排列 5 2 4 1 3 的字典序索引 逐位处理: 第一 ...

  7. 康托展开与逆康托展开模板(O(n^2)/O(nlogn))

    O(n2)方法: namespace Cantor { ; int fac[N]; void init() { fac[]=; ; i<N; ++i)fac[i]=fac[i-]*i; } in ...

  8. lightoj1060【康托逆展开】

    可以先看些资料:http://blog.csdn.net/keyboarderqq/article/details/53388936 参考谷巨巨:http://blog.csdn.net/azx736 ...

  9. 康托(Cantor)展开

    直接进入正题. 康托展开 Description 现在有"ABCDEFGHIJ”10个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的? Input ...

随机推荐

  1. kallsyms , addr to symbol

    #!/usr/bin/env python # addr2sym.py - resolve addresses to symbols, using a map file # Reads a log f ...

  2. VIN码/车架号的详解,车架号识别,VIN码识别,OCR车架号识别能带来什么

    各位车主在车检时不知道有没有注意到一件事,就是工作人员会打开车前盖在前围钢板上拓一张条码.下面来给大家介绍一下,这张条码就是VIN号,俗称钢印号,就像我们每个人都有自己的身份证号码一样,这也是汽车界的 ...

  3. Ubuntu 安装python后,安装python-dev

    1.通常情况下: sudo apt install python-dev 或者 在 sudo apt install python 命令下安装应该也附带了 python-dev 上述 pyhthon ...

  4. HTML(1)简介

    "超"文本标记语言--HTML 文本,是指书面语言的表现形式. 百度百科 说白了,文本就是你能看得到的字,不论是纸上的还是屏幕上的,都是文本.文本就是用来记录信息一种形式. 那么, ...

  5. 华为笔试——C++进制转换

    题目:2-62进制转换 题目介绍:输入一个n1 进制的整数(包括负数),将其转换成n2 进制,其中n1 .n2 的范围是 [ 2,62 ] .每个数字的范围是0-9.a-z.A-Z.不用考虑非法输入. ...

  6. A Product Recall 产品召回

    Rick: The Board of Directors has come to a decision. Our company will take an image hit, and it's go ...

  7. loadrunner socket协议问题归纳(5)

    获取服务器的返回值,可以用web_reg_save_param函数,该参数最好放到: 语法: int web_reg_save_param(const char *ParamName, <lis ...

  8. 利用box-shadow制作loading图

    我们见过很多利用css3做的loading图,像下面这种应该是很常见的.通常制作这种loading,我们会一个标签对应一个圆,八个圆就要八个标签.但是这种做法很浪费资源.我们可以只用一个标签,然后利用 ...

  9. 最全的NB-IoT芯片厂商、模组厂商信息

    NB-IoT作为LPWAN(低功耗广域网)的新兴技术,因为具有低功耗.低成本.广覆盖.海量节点等优势,并且在授权频段可以与2G.3G无缝连接而被运营商所青睐且接受.特别是到了2017年,据统计全球有5 ...

  10. 【探路者】互评beta版本

    成员博客 1蔺依铭:http://www.cnblogs.com/linym762/ 2张恩聚:http://www.cnblogs.com/zej87/ 3米赫:http://www.cnblogs ...