给定排列,求其唯一映射的排列编号:
rank[a[1]]*(n-1)!+rank[a[2]]*(n-2)!....rank[a[n]]*(n-n)!
int Cantor(int a[])
{
int ans=0;
for(int i=1;i<=n;i++)
{
int cnt=0;
for(int j=i+1;j<=n;j++)
if(a[i]>a[j])
cnt++;
ans+=(cnt*ft[n-i]);
}
return ans+1;
}
给定排列编号,还原排列:
void Anti(int x)
{
cls(v);
int t=x-1;
for(int i=1;i<=n;i++)
{
int k=t/ft[n-i],j;
t=t%ft[n-i];
for(j=1;j<=n;j++)
{
if(!v[j]) k--;
if(k==-1) break;
}
v[j]=1;
printf("%d",j);
}
printf("\n");
}