康托展开

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

例如有五个数字组成的数列: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. vscode eslint格式化配置

    { // vscode默认启用了根据文件类型自动设置tabsize的选项 "editor.detectIndentation": false, // 重新设定tabsize &qu ...

  2. Sqlite数据多表联合update

    其实在Mysql中,多表联合update不是什么难事. 语法: 1 UPDATE table_references SET col_name1=expr1 [, col_name2=expr2 ... ...

  3. 记录阿里云ECS(Centos7.4)安装mysql 8.0.X服务

    #*.rpm介绍 大多数二进制rpm包都包含在名称中倒数第二个字段中编译rpm的体系结构..rpm软件包有那么几种 *.src.rpm 源程序包,要先通过编译才能安装 *.noarch.rpm 该包适 ...

  4. 在Office 365 的如何给管理员赋予查看所有人邮箱的权限的Powershell

    连接至Office365 的Powershell Get-MsolUser -UserPrincipalName admin@***.partner.onmschina.cn //Get-MsolUs ...

  5. Matplotlib用法

    一 环境安装 Make sure you have installed numpy. 先安装np pip install matplotlib (Python2.X) pip3 install mat ...

  6. java引用Arcface,实现人脸识别(demo)

    ## 开发环境准备: ###开发使用到的软件和工具: * Jdk8.mysql5.7.libarcsoft_face.dll(so).libarcsoft_face_engine.dll(so).li ...

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

    前段时间测了loadrunner直接发送报文到socket上的性能测试.在此,稍微回顾整理下. 与socket通讯,有两种方式,一种是建立长连接,建立后,不停的发送,接收.另外一种是建立短连接,建立连 ...

  8. 2018-2019-20172321 《Java软件结构与数据结构》第五周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第五周学习总结 教材学习内容总结 第9章 排序与查找 9.1查找 查找是这样一个过程,即在某个项目组中寻找某一指定目标元 ...

  9. 团队Alpha冲刺(一)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内 ...

  10. 不要USB数据线调试Android开发

    不管是过去Eclipse还是现在的Android Studio开发Android,运行或者调试时都会利用USB数据线连接电脑和手机,特别是当现在的手机只有一个Type-c接口,意味着,插上后,啥也干不 ...