假如你使用模拟全排列计数,基本会超时;
实现原理:康托展开式
X=a[n](n-1)!+a[n-1](n-2)!+…+a[i]*(i-1)!+…+a[2]*1!+a[1]*0![1]
其中a[i]为当前未出现的元素中是排在第几个(从0开始)
列如 {1,2,3} 按从小到大排列一共6个。123 132 213 231 312 321 。
输入321,让你它在全排列中是第几个,321是6;
具体代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
//斐波那契表
long int fac[]={
1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800};
long cantor(int s[],int n)
{