康托展开

int fac[]={1,1,2,6,24,120,720,5040,40320,362880};
int Cantor(int *s,int n)//从1开始编号
{
    int ans=0;
    for(int i=0;i<n;i++){
        int tmp=0;
        for(int j=i+1;j<n;j++)
            if(s[j]<s[i]) tmp++;
        ans+=tmp*fac[n-i-1];
    }
    return ans;
}
void CantorReverse(int index,int *t,int n)//从1开始编号
{
    index--;
    bool Hash[10]={0};
    for(int i=0;i<n;i++){
        int tmp=index/fac[n-i-1];
        for(int j=0;j<=tmp;j++)
            if(Hash[j]) tmp++;
        t[i]=tmp+1;
        Hash[tmp]=1;
        index%=fac[n-i-1];
    }
}
原文地址:https://www.cnblogs.com/033000-/p/10174711.html