Pagini recente » Cod sursa (job #3256628) | Cod sursa (job #998884) | Cod sursa (job #2454841) | Cod sursa (job #9655) | Cod sursa (job #773677)
Cod sursa(job #773677)
#include <cstring>
#include <fstream>
#include <algorithm>
#include <map>
using namespace std;
int N, K, T;
int X[102], fr[22];
int power[22], fullbase;
map<pair<int, int>, long long> P;
long long number;
int getdigit(int num, int what)
{
return (num / power[what - 1]) % (K + 1);
}
long long getP(int num, int last)
{
if (num == 0) return 1;
if (P.find(make_pair(num, last)) != P.end()) return P[make_pair(num, last)];
long long resultnow = 0;
for (int i = 1; i <= N; ++i)
if (i != last && getdigit(num, i) > 0)
resultnow += getP(num - power[i - 1], i);
P[make_pair(num, last)] = resultnow;
return resultnow;
}
int main()
{
ifstream fin("nkperm.in");
ofstream fout("nkperm.out");
fin >> N >> K >> T;
power[0] = 1;
for (int i = 1; i <= N + 1; ++i)
power[i] = power[i - 1] * (K + 1);
fullbase = power[N] - 1;
for (int test = 1; test <= T; ++test)
{
char opt;
fin >> opt;
if (opt == 'A')
{
for (int i = 1; i <= N * K; ++i)
fin >> X[i];
long long result = 1;
int basenow = fullbase;
for (int i = 1; i <= N * K; ++i)
{
for (int j = 1; j < X[i]; ++j)
if (j != X[i - 1] && getdigit(basenow, j) > 0)
result += getP(basenow - power[j - 1], j);
basenow -= power[X[i] - 1];
}
fout << result << '\n';
}
else
{
fin >> number;
--number;
int basenow = fullbase, last = -1;
for (int i = 1; i <= N * K; ++i)
{
int j;
for (j = 1; j <= N; ++j)
if (j != last && getdigit(basenow, j) > 0)
{
if (getP(basenow - power[j - 1], j) <= number)
number -= getP(basenow - power[j - 1], j);
else
break;
}
basenow -= power[j - 1];
fout << j << ' ';
last = j;
}
fout << '\n';
}
}
fin.close();
fout.close();
}