int FACT[]={1,1,2,6,24,120,720,5040,40320,362880};//计算阶乘
int cantor(int a[],int n)
{
int x=0;
for(int i=0;i<n;i++)
{
int tot=0;
for(int j=i+1;j<n;j++)
{
if(a[j]<a[i])
tot++;
}
x+=tot*FACT[n-i-1];
}
return x;
}
void uncantor(int n,int num)
{//逆康托展开
int b[10],x;//b表示剩下的数,并且按升序排列
for(int i=0;i<n;i++)
b[i]=i+1;
for(int i=0;i<n;i++)
{
x=num/FACT[n-i-1];
num%=FACT[n-i-1];
a[i]=b[x];//x表示在当前数之前,比当前数小的数有x个,当前数为b[x];
for(int j=x;j<n;j++)
b[j]=b[j+1];//删去已选数x
}
}