Cod sursa(job #109695)

Utilizator damaDamaschin Mihai dama Data 25 noiembrie 2007 12:27:58
Problema NKPerm Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 1.08 kb
#include <stdio.h>
#include <string.h>
#include <map>

using namespace std;

long long v[21], nr;

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

	int i, n, k, t, j, a, x[21], l, used[21], cnt;
	long long sol;
	char c;
	v[0] = 1;
	for(i = 1; i <= 20; ++i)
	{
		v[i] = v[i - 1] * i;
	}

	scanf("%d %d %d ", &n, &k, &t);

	if(k == 1)
	{
		for(i = 1; i <= t; ++i)
		{
			scanf(" %c ", &c);
			if(c == 'A')
			{
				sol = 0;
				for(j = 1; j <= n; ++j)
				{
					x[j] = j - 1;
				}
				for(j = 1; j <= n; ++j)
				{
					scanf("%d ", &a);
					sol += (long long) x[a] * v[n - j];
					for(l = a + 1;  l <= n; ++l)
					{
						--x[l];
					}
				}
				++sol;
				printf("%lld\n", sol);
			}
			else
			{
				scanf("%lld ", &nr);
				memset(used, 0, sizeof(used));
				for(j = n; j > 0; --j)
				{
					l = (nr - 1) / v[j - 1] + 1;
					nr -= (l - 1) * v[j - 1];
					cnt = 1;
					while(l)
					{
						if(!used[cnt])
						{
							--l;
						}
						++cnt;
					}
					printf("%d ", cnt - 1);
					used[cnt - 1] = 1;
				}
				printf("\n");
			}
		}
	}
	return 0;
}