Pagini recente » Cod sursa (job #1217883) | Cod sursa (job #3188544) | Cod sursa (job #1649188) | Cod sursa (job #503117) | Cod sursa (job #678897)
Cod sursa(job #678897)
#include <stdio.h>
#include <string.h>
#define maxK 7
#define maxN 22
int N,K,NK;
int num[maxN];
int d[maxK];
inline long long back(int x)
{
if(d[K]==N) return 1;
long long ret=0;
for(int i=0;i<K;++i)
if(d[i])
{
--d[i];
++d[i+1];
if(i==x) ret+=d[i]*back(i+1);
else ret+=(d[i]+1)*back(i+1);
--d[i+1];
++d[i];
}
return ret;
}
int main()
{
int T,x,ax;
char ch;
long long cnt,sub;
freopen("nkperm.in","r",stdin);
scanf("%d %d %d\n",&N,&K,&T);
NK=N*K;
freopen("nkperm.out","w",stdout);
while(T--)
{
scanf("%c ",&ch);
if(ch=='A')
{
cnt=0;
ax=0;
memset(num,0,sizeof(num));
memset(d,0,sizeof(d));
d[0]=N;
for(int i=1;i<=NK;++i)
{
scanf("%d%c",&x,&ch);
for(int j=1;j<x;++j)
if(ax!=j&&num[j]<K)
{
--d[num[j]++];
++d[num[j]];
cnt+=back(num[j]);
--d[num[j]--];
++d[num[j]];
}
--d[num[x]++];
++d[num[x]];
ax=x;
}
printf("%lld\n",cnt+1);
}
else
{
scanf("%lld\n",&cnt);
--cnt;
memset(num,0,sizeof(num));
memset(d,0,sizeof(d));
d[0]=N;
for(int ok=0,i=1;i<=NK;++i,ok=0)
{
for(int j=1;j<=N;++j)
if(ax!=j&&num[j]<K)
{
--d[num[j]++];
++d[num[j]];
sub=back(num[j]);
if(sub>cnt)
{
ax=j;
ok=1;
break;
}
cnt-=sub;
--d[num[j]--];
++d[num[j]];
}
if(!ok)
{
--d[num[N]++];
++d[num[N]];
ax=N;
}
printf("%d ",ax);
}
printf("\n");
}
}
return 0;
}