我排第几个---康托展开
2015-05-05 13:54
162 查看
我排第几个
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
输入
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出
输出一个整数m,占一行,m表示排列是第几位;
样例输入
3 abcdefghijkl hgebkflacdji gfkedhjblcia
样例输出
1 302715242 260726926
利用康托展开可以轻松解决这题,
在百度百科上看到一个类似的题
1324是{1,2,3,4}排列数中第几个大的数:
第一位是1小于1的数没有,是0个 0*3! 第二位是3小于3的数有1和2,
但1已经在第一位了,所以只有一个数2 1*2! 。
第三位是2小于2的数是1,但1在第一位,所以有0个数 0*1! ,
所以比1324小的排列有0*3!+1*2!+0*1!=2个,1324是第三个小数。
ps:康托展开公式X=a *(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0!
#include <stdio.h> #include <string.h> bool visited[20]; int f(int x){ if (x == 1 || x == 0) return 1; return x * f(x - 1); } int main(){ int n; char a[13]; scanf("%d", &n); getchar(); int i, j; while (n--){ int sum = 0; memset(visited, 0, sizeof(visited)); gets(a); for (i = 0; i < 12; i++){ visited[a[i] - 97] = 1; int res = 0; for (j = 0; j < a[i] - 97; j++) if (!visited[j]) res++; sum += res * f(11 - i); } printf("%d\n", sum + 1); } return 0; }
相关文章推荐
- nyist 139 我排第几个&&143 第几是谁(康托展开和逆康托展开)
- nyoj 139 我排第几个(康托展开)
- NYOJ 139 我排第几个(康托展开)
- NYOJ 猜猜我是第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- 我排第几个——康托展开
- nyoj 139 我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- NYOJ139我排第几个(康托展开)
- nyoj 139我排第几个(康托展开)
- nyoj 139 我排第几个【数学】【康托展开】
- NYOJ 139 我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- 求某个数是排列中的第几个--康托展开
- nyoj-139-我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- nyoj 139 我排第几个(康托展开)
- 全排列的本质——康托展开以及本质原理分析——选取第N个——由序列推知第几个