康托展开式:用于解决和全排列相关的问题,主要的公式是:
a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[2]*1!+a[1]*0!
它主要求得:给你一个序列,求出这个序列在全排列中的第几小,例如 123 132 213 231 312 321
而序列 132 得出的结果为2。
它求的过程为: https://blog.csdn.net/axiqia/article/details/51346404
这个是我自己写的代码:
#include <algorithm>
using namespace std;
#include <iostream>
#include <stdio.h>
int main()
{
int n;
char a[1000];
scanf("%d",&n);
scanf("%s",a);
int sum=1;
for(int i=0;i<n;i++)
{
int cont=0;
for(int j=i+1;j<n;j++)
if(a[i]>a[j]) cont++;
int term=1;//阶乘
for(int j=1;j<=n-i-1;j++)
term=term*j;
sum+=term*cont;
}
printf("%d\n",sum);
}