Получение k-ой перестановки
Найти k-ую в лексикографическом порядке перестановку
int n;
int b[100]; //
void rec(int i, int k)
{ int j, t, f;
if(i==n)
{ for(i=0; i<n; ++i)
printf("%d%c",b[i],i<n-1?' ':'\n');
return;
}
//
f=1;
for(j=i+1; j<n; ++j)
f*=j-i;
//
for(j=i; j<n; ++j)
{
t=b[i];
b[i]=b[j];
b[j]=t;
if(k<=f)
rec(i+1);
else
k-=f;
}
}
//
Обратная задача решается также просто
int n;
int b[100]; //
int a[100]; //
void rec(int i, int k)
{ int j, t, f;
if(i==n)
{ printf("%d\n",k);
return;
}
//
f=1;
for(j=i+1; j<n; ++j)
f*=j-i;
//
for(j=i; j<n; ++j)
{
t=b[i];
b[i]=b[j];
b[j]=t;
if(b[i]==a[i])
rec(i+1,k);
else
k+=f;
}
}
//