Pagini recente » Cod sursa (job #1082264) | Cod sursa (job #2837831) | Cod sursa (job #1083384) | Cod sursa (job #2630818) | Cod sursa (job #374451)
Cod sursa(job #374451)
#include <stdio.h>
#include <map>
using namespace std;
#define baza 22
#define maxi ((1LL*1)<<55)
long long n, m, i, j, l, k, a, u, conf, aux[baza], v[baza], f[baza];
long long sol, qq;
char ch;
map<long, long long> d;
long long dinamica(long nr)
{
if(d.find(nr)!=d.end())
return d[nr];
long long i, j;
long long x=nr, cnou=0, aux[baza];
long long val=0;
for(i=k+1; i>=0; i--, x/=baza)
aux[i]=x%baza;
if(aux[0]==n) return 1;
for(i=1; i<=k; i++)
{
if(!aux[i]) continue;
aux[i]--;
aux[i-1]++;
cnou=0;
for(j=0; j<=k; j++)
cnou=cnou*baza+aux[j];
cnou=cnou*baza+i-1;
val+=dinamica(cnou)*(aux[i]+(aux[k+1]!=i));
if(val>maxi)
{
val=maxi;
break;
}
aux[i]++;
aux[i-1]--;
}
d[nr]=val;
return val;
}
int main()
{
freopen("nkperm.in", "r", stdin);
freopen("nkperm.out", "w", stdout);
scanf("%d%d%d\n", &n, &k, &m);
d[n]=1;
while(m--)
{
scanf("%c", &ch);
if(ch=='A')
{
for(i=0; i<n; i++)
v[i]=k;
sol=0;
u=n;
for(i=1; i<=n*k; i++)
{
scanf("%d", &a);
--a;
for(j=0; j<a; j++)
{
if(v[j]==0 || j==u) continue;
v[j]--;
conf=0;
for(l=0; l<=k; l++)
f[l]=0;
for(l=0; l<n; l++)
f[v[l]]++;
for(l=0; l<=k; l++)
conf=conf*baza+f[l];
sol+=dinamica(conf*baza+v[j]);
v[j]++;
}
v[a]--;
u=a;
}
printf("%lld\n", sol+1);
}
if(ch=='B')
{
scanf("%lld", &qq);
for(i=0; i<n; i++)
v[i]=k;
u=n;
for(i=1; i<=n*k; i++)
{
for(j=0; j<n; j++)
{
if(v[j]==0 || j==u) continue;
v[j]--;
conf=0;
for(l=0; l<=k; l++)
f[l]=0;
for(l=0; l<n; l++)
f[v[l]]++;
for(l=0; l<=k; l++)
conf=conf*baza+f[l];
sol=dinamica(conf*baza+v[j]);
v[j]++;
if(sol>=qq) break;
qq-=sol;
}
printf("%d ", j+1);
u=j;
--v[j];
}
printf("\n");
}
scanf("\n");
}
return 0;
}