题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=139
描述现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
-
输入
-
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出
- 输出一个整数m,占一行,m表示排列是第几位; 样例输入
-
3 abcdefghijkl hgebkflacdji gfkedhjblcia
样例输出
-
1 302715242 260726926
康拓展开模板题,定理可看:http://blog.csdn.net/baodream/article/details/79586804
代码如下:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
ll fac[21];
ll cartor(char str[])
{
int len=strlen(str);
ll ans=0;
for(int i=0;i<len;i++)
{
int tmp=0;
for(int j=i+1;j<len;j++)
if(str[i]>str[j])
tmp++;
ans+=tmp*fac[len-i-1];
}
return ans+1;
}
int main()
{
int t;
scanf("%d",&t);
fac[0]=1;
for(int i=1;i<=20;i++)
fac[i]=fac[i-1]*i;
char a[20];
while(t--)
{
scanf(" %s",a);
printf("%lld\n",cartor(a));
}
return 0;
}