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]; } }