Cod sursa(job #109759)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 25 noiembrie 2007 12:38:47
Problema NKPerm Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 1.3 kb
# 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;
}