康托展开作用:康托展开的作用是求n个数的全排列中某一个序列在所有排列中的次序(该排列次序(亦称之为排名)以字典序从小到大排序)。
公式:
X=a[n] [(n-1)!] +a[n-1][(n-2)!]+…+a[1] * [0!]。
其中X代表当前排列小的排列的个数,
a[i]代表当前排列里从i位置右侧比i位置的数小的数的个数。
#include <iostream>
using namespace std;
#define ll long long
const int fac[]={1,1,2,6,24,120,720,5040,40320,362880};//阶乘
ll c(string a,int n){
int ans=0;
for(int i=0;i<n;i++){
int temp=0;
for(int j=i+1;j<n;j++){
if(a[j]<a[i]){
temp++;
}
}
ans+=fac[n-i-1]*temp;
}
return ans+1;
}
int main(){
int n;
cin>>n;
string a;
cin>>a;
cout<<c(a,n)<<endl;
return 0;
}