康托展开
2013-07-31 18:20
239 查看
http://acm.nyist.net/JudgeOnline/problem.php?pid=139
难度:3
描述
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
输入第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;输出输出一个整数m,占一行,m表示排列是第几位;样例输入
样例输出
康托展开:
X=a
*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[2]*1!+a[1]*0!
http://baike.baidu.com/view/437641.htm
我排第几个
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
输入第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;输出输出一个整数m,占一行,m表示排列是第几位;样例输入
3 abcdefghijkl hgebkflacdji gfkedhjblcia
样例输出
1 302715242 260726926
#include<cstdio> const int Fact[13]={1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600}; int getTh(char code[],int n) { int sum=0; for(int i=0;i!=n;i++) { int rev=0; for(int j=i+1;j<n;j++) rev+=(code[i]>code[j]); sum+=rev*Fact[n-1-i]; //Fact[i]表示i的阶乘。 } return sum; } int main() { int n; char str[15]; scanf("%d",&n); while(n--) { scanf("%s",str); printf("%d\n",getTh(str,12)+1); } }
康托展开:
X=a
*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[2]*1!+a[1]*0!
http://baike.baidu.com/view/437641.htm