算法:康拓展开
#include<bits/stdc++.h>
#define ll long long
using namespace std;
char a[200];
ll f(int n) //求阶乘
{
ll sum=1;
for(int i=1; i<=n; i++)
sum=sum*i;
return sum;
}
int main()
{
int n; ll sum=0;
cin>>n;
cin>>a;
for(int i=0; i<n; i++) //遍历字符数组
{
ll m=0; //注意m每次都要清零
for(int j=i+1; j<n; j++)
{
if(a[i]>a[j])
m++; //m用来计数(即统计a[i]后面大于a[i]的数字的个数)
}
sum+=m*f(n-(i+1)); //此处因i的下标从0开始,故计算阶乘时要用n减去i+1
}
sum++; //因sum是从0开始计数的,而题中要求的是该排列是所有排列中字典序第几小的排列,故要再加上1
cout<<sum<<endl;
return 0;
}