Cod sursa(job #109905)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 25 noiembrie 2007 12:55:27
Problema NKPerm Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 0.96 kb
#include <stdio.h>
#include <string>

#define maxn 110
#define ll long long

int n,m;
int a[maxn],c[maxn];
ll f[maxn],sol,x;

int main()
{
	freopen("nkperm.in","r",stdin);
	freopen("nkperm.out","w",stdout);

	int T,i,j;
	char Q;
	scanf("%d %d %d ",&n,&m,&T);
	
	f[0]=1;
	for (i=1;i<=n;i++) f[i]=1LL*f[i-1]*i;

	while (T)
	{
		scanf("%c ",&Q);
		if (Q=='A')
		{
			for (i=1;i<=n;i++) scanf("%d ",&a[i]);
			
			sol=1;
			for (i=1;i<=n;i++)
			{
				c[i]=0;
				for (j=1;j<=i;j++)
					if (a[i]>=a[j]) c[i]++;
			}

			for (i=1;i<=n;i++)
				sol+=1LL*(a[i]-c[i])*f[n-i];

			printf("%lld\n",sol);
		}
		else {
				 scanf("%lld ",&x);
				 x--;
				 memset(c,0,sizeof(c));
				 memset(a,0,sizeof(a));
				 for (i=1;i<=n;i++)
				 {
					 int aux=x/f[n-i]+1;
					 for (j=1;j<=n && a[i]<aux;j++) 
						 if (c[j]==0) a[i]++;

					 a[i]=j-1;
					 
					 x%=f[n-i];
					 c[a[i]]++;
				 }

				 for (i=1;i<=n;i++) printf("%d ",a[i]);
				 printf("\n");
			 }
		T--;
	}

	return 0;
}