NYIST 139 我排第几个(康托展开)
2013-10-16 22:08
288 查看
关于康拓展开:
康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。
康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。
以下称第x个全排列是都是指由小到大的顺序。
公式
X = a
*(n-1)! + a[n-1]*(n-2)! + ... + a[i]*(i-1)! + ... + a[1]*0!
其中,a[i]为整数,并且0 <= a[i] < i, 1 <= i <= n。
a[i]的意义参见举例中的解释部分
举例
例如,3 5 7 4 1 2 9 6 8 展开为 98884。因为X = 2*8! + 3*7! + 4*6! + 2*5! + 0*4! + 0*3! + 2*2! + 0*1! + 0*0! = 98884.
解释:
排列的第一位是3,比3小的数有两个,以这样的数开始的排列有8!个,因此第一项为2*8!
排列的第二位是5,比5小的数有1、2、3、4,由于3已经出现,因此共有3个比5小的数,这样的排列有7!个,因此第二项为3*7!
以此类推,直至0*0!
因此,3 5 7 4 1 2 9 6 8是第98884小的排列。
维基百科上的介绍:http://zh.wikipedia.org/zh/%E5%BA%B7%E6%89%98%E5%B1%95%E5%BC%80
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=139
本题代码如下:
康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。
康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。
以下称第x个全排列是都是指由小到大的顺序。
公式
X = a
*(n-1)! + a[n-1]*(n-2)! + ... + a[i]*(i-1)! + ... + a[1]*0!
其中,a[i]为整数,并且0 <= a[i] < i, 1 <= i <= n。
a[i]的意义参见举例中的解释部分
举例
例如,3 5 7 4 1 2 9 6 8 展开为 98884。因为X = 2*8! + 3*7! + 4*6! + 2*5! + 0*4! + 0*3! + 2*2! + 0*1! + 0*0! = 98884.
解释:
排列的第一位是3,比3小的数有两个,以这样的数开始的排列有8!个,因此第一项为2*8!
排列的第二位是5,比5小的数有1、2、3、4,由于3已经出现,因此共有3个比5小的数,这样的排列有7!个,因此第二项为3*7!
以此类推,直至0*0!
因此,3 5 7 4 1 2 9 6 8是第98884小的排列。
维基百科上的介绍:http://zh.wikipedia.org/zh/%E5%BA%B7%E6%89%98%E5%B1%95%E5%BC%80
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=139
本题代码如下:
#include <cstdio> const int f[13] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600}; int kt(char s[],int n) //n表示该排列有n个数 { int sum = 0; for(int i = 0; i < n; i++) { int temp = 0; for(int j = i + 1; j < n; j++) if(s[j] < s[i]) temp ++; sum += f[n - 1 - i] * temp; //f 表示n的阶乘 } return sum + 1; } int main() { int n; char s[13]; scanf("%d", &n); while(n--) { scanf("%s", s); printf("%d\n", kt(s, 12)); } return 0; }
相关文章推荐
- nyist 139 我排第几个&&143 第几是谁(康托展开和逆康托展开)
- nyoj 139 我排第几个(康托展开)
- nyoj 139我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- NYOJ 139 我排第几个(康托展开)
- NYOJ 139 我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- 我排第几个 http://acm.nyist.net/JudgeOnline/problem.php?pid=139
- nyoj 139 我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- NYOJ ~ 139 ~ 我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- nyist - 139 - 我排第几个【康托展开应用】
- nyoj 139 我排第几个(康托展开)
- nyoj139我排第几个&nyoj第几是谁?——康托展开及康托逆展开
- nyoj 139 我排第几个(康托展开)