Pagini recente » Cod sursa (job #1800196) | Cod sursa (job #3277096) | Cod sursa (job #2311597) | Cod sursa (job #316793) | Cod sursa (job #254756)
Cod sursa(job #254756)
#include<stdio.h>
#define infile "planeta.in"
#define outfile "planeta.out"
#define nmax 50
int viz[nmax];
int p[nmax]; //aici vom face permutarea
long long f[nmax]; //aici vom avea factorialul
long long nr,k; //permutarea pe care trebuei sa o facem
int ok;
int n; //lungimea permutarii
void bk(int x)
{
int i;
if(x>n)
{
nr++;
if(nr==k)
{
for(i=1;i<=n;i++)
printf("%d ",p[i]);
ok=1;
}
}
else
{
for(i=1;i<=n;i++)
if(!viz[i]&&!ok)
{
p[x]=i; viz[i]=1;
bk(x+1);
viz[i]=0;
}
}
}
int main()
{
int i,j;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
scanf("%d %lld",&n,&k);
//bk(1); printf("\n");
for(f[0]=1,i=1;i<=n;i++) f[i]=i*f[i-1]; //calculam factorialul
for(i=1;i<=n;i++)
{
if(k%f[n-i]) { p[i]=(k/f[n-i])+1; k-=((p[i]-1)*f[n-i]); }
else { p[i]=(k/f[n-i]); k-=((p[i]-1)*f[n-i]); }
}
//renumerotam numerele de ordine al permutarii
for(i=n-1;i>=1;i--)
for(j=i+1;j<=n;j++)
if(p[j]>=p[i]) p[j]++;
//afisam permutarea
for(i=1;i<=n;i++) printf("%d ",p[i]);
fclose(stdin);
fclose(stdout);
return 0;
}