Pagini recente » Cod sursa (job #41945) | Cod sursa (job #2544050) | Cod sursa (job #1390128) | Cod sursa (job #312584) | Cod sursa (job #116646)
Cod sursa(job #116646)
using namespace std;
#include<cstdio>
#include<cstring>
#include<map>
#define Nm 21
#define Km 7
#define Nrm (1ll<<55)
int P[Km],n,k;
map<int,long long> M;
long long nr(int a)
{
if(M[a])
return M[a];
if(a/P[k]%(n+1)==n)
{
M[a]=1;
return 1;
}
int i;
for(i=0;i<k;++i)
{
if(a/P[k+1]==i)
M[a]+=(a/P[i]%(n+1)-1)*nr(a%P[k+1]-P[i]+P[i+1]+(i+1)*P[k+1]);
else
M[a]+=a/P[i]%(n+1)*nr(a%P[k+1]-P[i]+P[i+1]+(i+1)*P[k+1]);
if(M[a]>Nrm)
{
M[a]=Nrm;
break;
}
}
return M[a];
}
void solveA()
{
int F[Nm],i,j,x,xp=-1,a=n;
long long ans=1;
memset(F,0,sizeof(F));
for(i=0;i<n*k;++i)
{
scanf("%d",&x);
for(j=1;j<x;++j)
if(j!=xp)
ans+=nr(a-P[F[j]]+P[F[j]+1]+(F[j]+1)*P[k+1]);
a-=P[F[x]];
++F[x];
a+=P[F[x]];
xp=x;
}
printf("%lld\n",ans);
}
void solveB()
{
int F[Nm],i,j,xp=-1,a=n;
long long x,v;
scanf("%lld",&x);
memset(F,0,sizeof(F));
for(i=1;i<=n*k;++i)
{
for(j=1;;++j)
if(j!=xp)
{
v=nr(a-P[F[j]]+P[F[j]+1]+(F[j]+1)*P[k+1]);
if(x<=v)
break;
x-=v;
}
if(i<n*k)
printf("%d ",j);
else
printf("%d\n",j);
a-=P[F[j]];
++F[j];
a+=P[F[j]];
xp=j;
}
}
int main()
{
char c;
int i,t;
freopen("nkperm.in","r",stdin);
freopen("nkperm.out","w",stdout);
scanf("%d%d%d",&n,&k,&t);
P[0]=1;
for(i=1;i<=k+1;++i)
P[i]=P[i-1]*(n+1);
while(t--)
{
scanf(" %c",&c);
if(c=='A')
solveA();
else
solveB();
}
return 0;
}