康托展开:
int fac[]={1,1,2,6,24,120,720,5040,40320,362880}; //0~9的阶乘
int cantuo(int s[],int e) //第一位从0开始,e为最后一个的下标
{
int i,j,temp,num=0;
for (i=0;i<e;i++)
{
temp=0;
for (j=i+1;j<=e;j++)
{
if (s[j]<s[i])
{
temp++;
}
}
num+=fac[e-i]*temp;
}
return num+1;
}
逆康拓展开
int* uncantuo(int x,int k)
{
int *res=new int[10];
bool vis[10];
int t,i,j,l;
x--;
memset(vis,false,sizeof(vis));
for (i=1;i<=k;i++)
{
t=x/fac[k-i];
x-=t*fac[k-i];
for (j=1,l=0;l<=t;j++){
if(!vis[j]) l++;
}
j--;
vis[j]=true;
res[i-1]=j;
}
return res;
}