Pagini recente » Cod sursa (job #1795136) | Cod sursa (job #2332163) | Cod sursa (job #1833615) | Cod sursa (job #2795506) | Cod sursa (job #109759)
Cod sursa(job #109759)
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
long int n,perm[50],k,t;
long long int fact[50]={1};
FILE *g=fopen("nkperm.out","w");
void get_ordinal()
{
long long int cod=0;
long int i,j,used[50]={0},nr;
for (i=1;i<=n;i++)
{
nr=0;
used[perm[i]]=1;
for (j=1;j<=perm[i];j++)
if (!used[j]) nr++;
if (nr) cod+=fact[n-i]*nr;
}
fprintf(g,"%lld\n",cod+1);
}
void get_permutation(long long int cod)
{
long int already=0,used[50]={0},i,nr,aux,j;
for (i=1;i<=n;i++)
{
//(n-i)!
nr=cod/fact[n-i];
if (cod%fact[n-i]==0) nr--;
nr++;
aux=nr-1;
for (j=1;nr;j++)
if (!used[j]) nr--;
j--;
used[j]=1;
if (already) fprintf(g," ");
already++;
fprintf(g,"%ld",j);
cod-=aux*fact[n-i];
}
fprintf(g,"\n");
}
long int citire()
{
FILE *f=fopen("nkperm.in","r");
fscanf(f,"%ld%ld%ld",&n,&k,&t);
long int i,j,q,x;
char s[1100],*p;
for (i=1;i<=n;i++) fact[i]=fact[i-1]*i;
if (k==1)
{
fgets(s,1000,f);
for (j=1;j<=t;j++)
{
fgets(s,1000,f);
if (s[0]=='A')
{
p=strtok(s+1," \n");
for (q=1;q<=n;q++)
{
perm[q]=atoi(p);
p=strtok(NULL," \n");
}
get_ordinal();
}
else
{
p=strtok(s+1," \n");
x=atoi(p);
get_permutation(x);
}
}
}
return 0;
}
int main()
{
citire();
return 0;
}