康托展开

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

例如有五个数字组成的数列: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. 【转】在Android Studio中下载Android SDK的两种方式(Android Studio3.0、windows)

    在Android Studio中下载Android SDK的两种方式(Android Studio3.0.windows) 方式一.设置HTTP Proxy1. 打开Settings2. 点击HTTP ...

  2. katalon系列十一:Katalon Studio在Jenkins持续集成

    以下在WIN10上运行正常.安装准备:一.安装Katalon Studio二.安装Jenkins三.获取Katalon命令行运行命令:点击工具栏的‘Build CMD’按钮,选择测试集以及其他选项:选 ...

  3. 优化 VR 动作类游戏《Space Pirate Trainer*》以便在英特尔® 集成显卡上实现卓越的表现

    Space Pirate Trainer* 是一款面向 HTC Vive*.Oculus Touch* 和 Windows Mixed Reality* 的原创发行游戏.版本 1.0 于 2017 年 ...

  4. JAVA Date、String、Calendar类型之间的转化

    1.Calendar 转化 String //获取当前时间的具体情况,如年,月,日,week,date,分,秒等 Calendar calendat = Calendar.getInstance(); ...

  5. Eclipse将Java项目打成jar工具包

    jar包:就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性以及方法. jar包可分为可执行jar包和jar工具包,在这里, ...

  6. Bellman-ford 模板

    #include<bits/stdc++.h> const int inf=0x3f3f3f3f; ; struct edge{ int u,v;//两个点 int w; //权值 Edg ...

  7. oracle时间转换查询

    查询oracle 数据库时要查询某一字段的最大时间或者最小时间,因为oracle的时间点 精确到毫秒 甚至更高精度级别 根据字段来转换成对应的时间格式: SELECT TO_CHAR(MAX(crea ...

  8. xpath抓取的值有\r\n\t时,去掉的方法

    解决办法: normalize-space() 例子: 原来的xpath为: user=selector.xpath('//*[@id="Con"]/tr[1]/th/text() ...

  9. 详讲H5、WebApp项目中常见的坑以及注意事项

    首先我们中会有一些常用的meta标签,如下: <!--防止手机中网页放大和缩小--> <meta name="viewport" content="wi ...

  10. Scrum立会报告+燃尽图(十一月十七日总第二十五次):设计调查问卷;修复上一阶段bug

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...