Cod sursa(job #678891)

Utilizator rootsroots1 roots Data 12 februarie 2012 15:18:03
Problema NKPerm Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <stdio.h>
#include <string.h>

#define maxK 6
#define maxN 21

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;
}