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

康托展开 康托展开解决的是当前序列在全排序的名次的问题. 例如有五个数字组成的数列: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 对于…
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4865    Accepted Submission(s): 2929 Problem Description Now our hero finds the door to the BEelzebub feng5166. He o…
康托展开 简介:对于给定的一个排列,求它是第几个,比如54321是n=5时的第120个.(对于不是1~n的排列可以离散化理解) 做法: ans=a[n]*(n-1)!+a[n-1]*(n-2)!+~~~~a[1]*0!.(a[n]表示在给定的排列中,还没出现的,而且比当前值小的数的个数) 如果说对于一个数学定理你会熟练运用,也许已经足够了,但日后总感觉少点什么,好像做了亏心事一般,因为你没有底气去用它,因为你不知道它为什么是对的,所以证明是第一步. 1.证明:因为是按字典序排序,对于第x个位置数…
讲解康托展开与逆康托展开.http://wenku.baidu.com/view/55ebccee4afe04a1b071deaf.html #include<bits/stdc++.h> using namespace std; int fac[20]; int fun(){ fac[0]=1; int i; for(i=1;i<=12;i++){ fac[i]=fac[i-1]*i; } } int main(){ int t,i,j,c,sum,num; char str[15];…
康托展开(有关全排列) 康托展开:已知一个排列,求这个排列在全排列中是第几个 康托展开逆运算:已知在全排列中排第几,求这个排列 定义: 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!,…
(7.15)康托展开,就是把全排列转化为唯一对应自然数的算法.它可以建立1 - n的全排列与[1, n!]之间的自然数的双向映射. 1.康托展开: 尽管我并不清楚康托展开的原理何在,这个算法的过程还是比较好记的.正确性之后有机会询问下学长. 如果从1开始给全排列的排名从大到小编号的话(从0开始也可,建立的是与[0, n!-1]的映射,本质相同),定义rk为排名,a是排列数组,排列有n位(最低位是第0位),那么有公式 rk - 1 = cnt[n-1] * (n-1)! + cnt[n-2] *…
康托展开 引入 康托展开(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\) ,…
O(n2)方法: namespace Cantor { ; int fac[N]; void init() { fac[]=; ; i<N; ++i)fac[i]=fac[i-]*i; } int encode(int* a,int n) { ; ; i>=; --i) { ; ; j<n; ++j)if(a[j]<a[i])++cnt; ret+=cnt*fac[n--i]; } return ret; } vector<int> decode(int x,int n…
可以先看些资料:http://blog.csdn.net/keyboarderqq/article/details/53388936 参考谷巨巨:http://blog.csdn.net/azx736420641/article/details/50982142 #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<i…
直接进入正题. 康托展开 Description 现在有"ABCDEFGHIJ”10个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的? Input 第一行有一个整数n(0<n<=100000); 随后有n行,每行是一个排列: Output 输出一个整数m,占一行,m表示排列是第几位: Sample Input 3ABCDEFGHIJ HGEBFACDJIGDEDHJBXIA Sample Output 128033221911924   其…