Cod sursa(job #109864)

Utilizator victorsbVictor Rusu victorsb Data 25 noiembrie 2007 12:51:28
Problema NKPerm Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 1.19 kb
#include <cstdio>
#include <cstring>

#define Nmax 32
#define ll long long

int n, k, t;
int sir[Nmax];
ll p[Nmax];
int v[Nmax];

void citire()
{
	scanf("%d %d %d", &n, &k, &t);
}

void solve()
{
	int i, j, ct, k;
	ll val;
	char tip;

	p[0] = 1;
	for (i = 1; i <= n; ++i)
		p[i] = p[i - 1] * i;
	p[0] = 0;

	while (t)
	{
        scanf(" %c", &tip);

		if (tip == 'A')
		{
			memset(v, 0, sizeof(v));
			for (i = 1; i <= n; ++i)
				scanf("%d", &sir[i]);

			val = 0;
			for (i = 1; i <= n; ++i)
			{
				ct = 0;
				for (j = 1; j < sir[i]; ++j)
					if (!v[j])
						++ct;
				v[sir[i]] = 1;
				val += ct * p[n - i];
			}
			
			printf("%lld\n", val + 1);
		}
		else
		{
			memset(v, 0, sizeof(v));
			scanf("%lld\n", &val);

			for (i = 1; i <= n; ++i)
			{
				for (j = 1; j <= n - i + 1; ++j)
					if (j * p[n - i] >= val) break;
				val -= (j - 1) * p[n - i];
				
				if (i == n) j = 1;
				ct = 0;
				for (k = 1; k <= n; ++k)
					if (!v[k])
					{
						++ct;
						if (ct == j)
							break;
					}
				v[k] = 1;
				printf("%d ", k);
			}

			printf("\n");
		}

		--t;
	}
}

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

	citire();
	if (k == 1) solve();

	return 0;
}