Pagini recente » Cod sursa (job #752543) | Cod sursa (job #2487887) | Cod sursa (job #84421) | Cod sursa (job #1200918) | Cod sursa (job #678708)
Cod sursa(job #678708)
#include <stdio.h>
#include <string.h>
#define maxN 21
#define maxn 101
int v[maxn];
int pre[maxn];
int num[maxN];
int N,K,n;
inline long long back(int v[],int num[],int x)
{
long long ret=0;
if(x>n) return 1;
for(int i=1;i<=N;++i)
if(i!=v[x-1]&&num[i]<K)
{
++num[i];
v[x]=i;
ret+=back(v,num,x+1);
--num[i];
}
return ret;
}
int main()
{
int T;
char ch;
long long cnt,sub;
freopen("nkperm.in","r",stdin);
scanf("%d %d %d\n",&N,&K,&T);
n=N*K;
freopen("nkperm.out","w",stdout);
while(T--)
{
scanf("%c ",&ch);
if(ch=='A')
{
for(int i=1;i<=n;++i) scanf("%d%c",&v[i],&ch);
cnt=1;
memset(pre,0,sizeof(pre));
memset(num,0,sizeof(num));
for(int i=1;i<=n;++i)
{
for(int j=1;j<v[i];++j)
if(j!=v[i-1]&&num[j]<K)
{
pre[i]=j;
++num[j];
cnt+=back(pre,num,i+1);
--num[j];
}
pre[i]=v[i];
++num[v[i]];
}
printf("%lld\n",cnt);
}
else
{
scanf("%lld\n",&cnt);
--cnt;
memset(v,0,sizeof(v));
memset(num,0,sizeof(num));
for(int i=1;i<=n;++i)
for(int j=1;j<=N;++j)
if(j!=v[i-1]&&num[j]<K)
{
++num[j];
v[i]=j;
sub=back(v,num,i+1);
--num[j];
if(sub>cnt)
{
v[i]=j;
++num[v[i]];
break;
}
else cnt-=sub;
}
for(int i=1;i<=n;++i) printf("%d ",v[i]);
printf("\n");
}
}
return 0;
}