Pagini recente » Cod sursa (job #277853) | Cod sursa (job #1213957) | Cod sursa (job #1899246) | Cod sursa (job #1985525) | Cod sursa (job #120785)
Cod sursa(job #120785)
#include <stdio.h>
#include <string.h>
#include <map>
#include <vector>
using namespace std;
#define NMAX 40
const long long MAX = (1LL << 55);
int n, k, t;
int p[NMAX];
//int until;
int aparitii[NMAX];
map< vector<int>, long long > h;
long long x;
#define until (n)*(k)
long long numara(vector<int> v)
{
if(h.find(v) != h.end()) return h[v];
if(v[k] == n) return 1;
int i;
int ultim = v[k+1];
long long aux, res = 0;
for(i = 0; i < k; ++i)
if(v[i])
{
--v[i];
++v[i+1];
v[k+1] = i+1;
if(ultim != i)
{
aux = 1LL*(v[i]+1) * numara(v);
//h[v] = aux;
res = 1LL*res + aux;
}
else
{
aux = 1LL*v[i] * numara(v);
//h[v] = aux;
res = 1LL*res + aux;
}
++v[i];
--v[i+1];
if(res >= MAX)
{
v[k+1] = ultim;
h[v] = MAX;
return MAX;
}
}
v[k+1] = ultim;
h[v] = res;
return res;
}
void findA()
{
long long res = 1;
vector<int> v(k+3, 0);
for(vector<int> :: iterator it = v.begin(); it != v.end(); ++it) *it = 0;
memset(aparitii, 0, sizeof(aparitii));
v[0] = n;
for(int i = 1, j; i <= until; ++i)
{
for(j = 1; j < p[i]; ++j)
if(j != p[i-1] && aparitii[j] < k)
{
--v[ aparitii[j] ];
++v[ aparitii[j]+1 ];
v[k+1] = aparitii[j]+1;
res = 1LL*res + numara(v);
++v[ aparitii[j] ];
--v[ aparitii[j]+1 ];
}
--v[ aparitii[ p[i] ] ];
++aparitii[ p[i] ];
++v[ aparitii[ p[i] ] ];
}
if(res < 0 || res > MAX)
for(;;);
printf("%lld\n", res);
}
void findB()
{
vector<int> v(k+3, 0);
for(vector<int> :: iterator it = v.begin(); it != v.end(); ++it) *it = 0;
long long aux, res = 0;
memset(aparitii, 0, sizeof(aparitii));
v[0] = n;
for(int j, i = 1; i <= until; ++i)
{
for(j = 1; j <= n; ++j)
{
if(j != p[i-1] && aparitii[j] < k)
{
--v[ aparitii[j] ];
++v[ aparitii[j]+1 ];
v[k+1] = aparitii[j]+1;
aux = (long long)numara(v);
++v[ aparitii[j] ];
--v[ aparitii[j]+1 ];
if((long long)res + aux >= x)
{
p[i] = j;
j = n+1;
}
else res += aux;
}
}
--v[ aparitii[p[i]] ];
++aparitii[p[i]];
++v[ aparitii[p[i]] ];
}
for(int i = 1; i <= until; ++i) printf("%d ", p[i]); printf("\n");
}
int main()
{
freopen("nkperm.in", "r", stdin);
freopen("nkperm.out", "w", stdout);
scanf("%d %d %d\n", &n, &k, &t);
//until = n*k;
char c;
int i;
while(t--)
{
scanf("%c ", &c);
if(c == 'A')
{
for(i = 1; i <= until; ++i)
scanf("%d", &p[i]);
findA();
}
else
{
scanf("%lld", &x);
findB();
}
scanf("\n");
}
//printf("%d\n", until);
return 0;
}