# Description

The N (1 <= N <= 20) cows conveniently numbered 1…N are playing
yet another one of their crazy games with Farmer John. The cows
will arrange themselves in a line and ask Farmer John what their
line number is. In return, Farmer John can give them a line number
and the cows must rearrange themselves into that line.
A line number is assigned by numbering all the permutations of the
line in lexicographic order.

Consider this example:
Farmer John has 5 cows and gives them the line number of 3.
The permutations of the line in ascending lexicographic order:
1st: 1 2 3 4 5
2nd: 1 2 3 5 4
3rd: 1 2 4 3 5
Therefore, the cows will line themselves in the cow line 1 2 4 3 5.

The cows, in return, line themselves in the configuration “1 2 5 3 4” and
ask Farmer John what their line number is.

Continuing with the list:
4th : 1 2 4 5 3
5th : 1 2 5 3 4
Farmer John can see the answer here is 5

Farmer John and the cows would like your help to play their game.
They have K (1 <= K <= 10,000) queries that they need help with.
Query i has two parts: C_i will be the command, which is either ‘P’
or ‘Q’.

If C_i is ‘P’, then the second part of the query will be one integer
A_i (1 <= A_i <= N!), which is a line number. This is Farmer John
challenging the cows to line up in the correct cow line.

If C_i is ‘Q’, then the second part of the query will be N distinct
integers B_ij (1 <= B_ij <= N). This will denote a cow line. These are the
cows challenging Farmer John to find their line number.

1st: 1 2 3 4 5
2nd: 1 2 3 5 4
3rd: 1 2 4 3 5
4th : 1 2 4 5 3
5th : 1 2 5 3 4
……

# Input

• Line 1: Two space-separated integers: N and K
• Lines 2..2*K+1: Line 2*i and 2*i+1 will contain a single query.
Line 2*i will contain just one character: ‘Q’ if the cows are lining
up and asking Farmer John for their line number or ‘P’ if Farmer
John gives the cows a line number.

If the line 2*i is ‘Q’, then line 2*i+1 will contain N space-separated
integers B_ij which represent the cow line. If the line 2*i is ‘P’,
then line 2*i+1 will contain a single integer A_i which is the line
number to solve for.

Output
* Lines 1..K: Line i will contain the answer to query i.

If line 2*i of the input was ‘Q’, then this line will contain a
single integer, which is the line number of the cow line in line
2*i+1.

If line 2*i of the input was ‘P’, then this line will contain N
space separated integers giving the cow line of the number in line
2*i+1.

5 2

P

3

Q

1 2 5 3 4

1 2 4 3 5

5

# 代码

#include <bits/stdc++.h>

#define N 50
#define ll long long

ll jc[N];
int n,k,num[N];
bool vis[N];

void KTN()
{
ll x;
scanf("%lld",&x);
x--;
std::memset(vis,0,sizeof(vis));
for (int i = n - 1; i >= 0; i--)
{
int num = x / jc[i];
int now = 0;
x %= jc[i];
for (int j = 1; j <= n; j++)
if (!vis[j])
{
if (now == num)
{
vis[j] = 1;
printf("%d",j);
if (i)
printf(" ");
break;
}
else now++;
}
}
printf("\n");
}

void KT()
{
for (int i = n; i > 0; i--)
scanf("%d",&num[i]);
ll ans = 0;
for (int i = n - 1; i >= 0; i--)
{
ll sum = 0;
for (int j = 1; j <= i; j++)
if (num[j] < num[i + 1])
sum++;
ans += sum * jc[i];
}
printf("%lld\n",ans + 1);
}

void getJC()
{
for (int i = 1; i <= n; i++)
jc[i] = jc[i - 1] * i;
}

int main()
{
scanf("%d%d",&n,&k);
jc = 1;
getJC();
for (int i = 1; i <= k; i++)
{
char ch;
std::cin>>ch;
if (ch == 'P')
KTN();
else KT();
}
}
03-14 307                                                                          03-24 43
08-25 29
06-10 198
03-14 396
01-23 483
10-15 25
12-14 224
10-28 23
05-16 716
07-17 2609
04-26 52
10-28 4902
03-16 352
02-10 22
03-17 214
02-18 34
09-16 48