[算法总结]康托展开Cantor Expansion】的更多相关文章

目录 一.关于康托展开 1.什么是康托展开 2.康托展开实现原理 二.具体实施 1.模板 一.关于康托展开 1.什么是康托展开 求出给定一个由1n个整数组成的任意排列在1n的全排列中的位置. 解决这样问题的算法叫康托展开. 例如: \(n=4\),序列a={\(1,3,4,2\)},那么a在1~4中的全排列位置为第4个. 2.康托展开实现原理 要知道序列a排在第几位,我们就需要知道序列a之前有多少位. 我们按照上面的栗子计算: 1.比1小的数有0个,有\(0\times(4-1)!=0\)种排列…
http://poj.org/problem?id=1077 http://acm.hdu.edu.cn/showproblem.php?pid=1043 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!.这就是康托展开.康拓展开可以用来表示排列状态,对于本题的9个数字的所有排列只需要9位,所有状态…
这三个题的代码分别对应第二个第一个第三个 在刘汝佳蓝书上我遇到了这个康托展开题. 当时去了解了一下,发现很有意思 百度上的康托展开定义 原理介绍 编辑 康托展开运算 其中, 为整数,并且 . 的意义为在ai之后出现的数有几个比他小 康托展开的逆运算 既然康托展开是一个双射,那么一定可以通过康托展开值求出原排列,即可以求出n的全排列中第x大排列. 如n=5,x=96时: 首先用96-1得到95,说明x之前有95个排列.(将此数本身减去1)用95去除4! 得到3余23,说明有3个数比第1位小,所以第…
目录 引入 这位老爷子就是康托 基本概念 康托展开是一个全排列到一个自然数的双射,常用于构建hash表时的空间压缩.设有n个数(1,2,3,4,-,n),可以有组成不同(n!种)的排列组合,康托展开表示的就是是当前排列组合在n个不同元素的全排列中的名次. 所以,康托展开是为了把一种全排列压缩成一个整数,它的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆的,称为逆康托展开(这篇博客不会讲). 基本原理 我们用a[i]表示位于位置i后面的数小于A[i]值的个数. 公式长这样: \(X=\…
康托展开 引入 康托展开(Cantor expansion)用于将排列转换为字典序的索引(逆展开则相反) 百度百科 维基百科 方法 假设我们要求排列 5 2 4 1 3 的字典序索引 逐位处理: 第一位:5 2 4 1 3,如果一个排列的第一位比 \(5\) 小(有 \(4\) 种情况) 则不管其后 \(4\) 位如何(有 \(4!\) 种情况),其字典序都更小 所以,至少有 \(4\times 4!\) 个排列字典序更小. 第二位:5 2 4 1 3,如果另一个排列的第一位就是 \(5\) ,…
康托展开(有关全排列) 康托展开:已知一个排列,求这个排列在全排列中是第几个 康托展开逆运算:已知在全排列中排第几,求这个排列 定义: X=an(n-1)!+an-1(n-2)!+...+ai(i-1)!+...+a21!+a1*0! ai为整数,并且0<=ai<i(1<=i<=n) 简单点说就是,判断这个数在其各个数字全排列中从小到大排第几位. 比如 1 3 2,在1.2.3的全排列中排第2位. 康托展开有啥用呢? 维基:n位(0~n-1)全排列后,其康托展开唯一且最大约为n!,…
直接进入正题. 康托展开 Description 现在有"ABCDEFGHIJ”10个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的? Input 第一行有一个整数n(0<n<=100000); 随后有n行,每行是一个排列: Output 输出一个整数m,占一行,m表示排列是第几位: Sample Input 3ABCDEFGHIJ HGEBFACDJIGDEDHJBXIA Sample Output 128033221911924   其…
题目传送门 Uim的情人节礼物·其之壱 题目描述 情人节到了,Uim打算给他的后宫们准备情人节礼物.UIm一共有N(1<=N<=9)个后宫妹子(现充去死 挫骨扬灰!). 为了维护他的后宫的稳定.他通过编程,得出了一个送礼物的最佳顺序.这个我们管不着. 然而他认为,如果什么事情做得太圆满不是什么好事.于是他希望得到 原定顺序 的 前一个字典序的序列. 输入输出格式 输入格式: 第一行一个整数N 第二行N个整数,表示原定排列 输出格式: 前一个排列 输入输出样例 输入样例#1: 3 1 3 2 输…
一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二.两种方法 该题很明显,是一个八数码的问题,就是9宫格,里面有一个空格,外加1~8的数字,任意一种情况,如果能通过移动空格使数码组成 1 2 3 4 5 6 7 8 0 的形式,就输出变换的序列,如果不能,输出unsolvable. 逆向$BFS$+康托展开 1.什么是康托展开 https://zh.wikipedia.org/wiki/%E5%BA%B7%E6%89%98%E5%B1%95…
原题网址:http://hihocoder.com/problemset/problem/1312 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 在小Ho的手机上有一款叫做八数码的游戏,小Ho在坐车或者等人的时候经常使用这个游戏来打发时间. 游戏的棋盘被分割成3x3的区域,上面放着标记有1~8八个数字的方形棋子,剩下一个区域为空. 游戏过程中,小Ho只能移动棋子到相邻的空区域上.当小Ho将8个棋子都移动到如下图所示的位置时,游戏就结束了. 小Hi:小Ho,你觉…