Cod sursa(job #109692)

Utilizator devilkindSavin Tiberiu devilkind Data 25 noiembrie 2007 12:25:50
Problema NKPerm Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 2.06 kb
#include <stdio.h>
#define NMAX 22


char c;
long long n,k,T,nrt,a[NMAX],sol,i,h[NMAX],x,j;

int main()
{

freopen("nkperm.in","r",stdin);
freopen("nkperm.out","w",stdout);

scanf("%lld %lld %lld\n",&n,&k,&T);

if (k==1)
        for (nrt=1;nrt<=T;nrt++)
                {
                scanf("%c",&c);

                if (c=='A')
                        {
                        for (i=1;i<=n;i++)
                                scanf("%ld",&a[i]);

                        sol=1;
                        k=1;
                        for (i=1;i<=n-1;i++) k=k*i;

                        
                        for (i=1;i<n;i++)
                                {
                                sol=sol+(a[i]-1)*k;
                                k/=(n-i);

                                for (j=i+1;j<=n;j++)
                                        if (a[j]>a[i]) a[j]--;
                                }
                        printf("%lld\n",sol);
                        }
                        else
                        {
                        scanf("%lld",&sol);

                        k=1;
                        for (i=1;i<=n-1;i++) {k*=i;h[i]=1;}
                        h[n]=1;

                        for (i=1;i<n;i++)
                                {
                                a[i]=sol/k;
                                if (a[i]*k!=sol) a[i]++;
                                sol=sol-(a[i]-1)*k;
                                k/=(n-i);
                                x=0;j=1;
                                while (x<a[i])
                                        {
                                        x=x+h[j];
                                        j++;
                                        }
                                j--;
                                h[j]=0;
                                printf("%lld ",j);
                                }
                        for (i=1;i<=n;i++) if (h[i]==1) printf("%ld",i);
                        printf("\n");
                        }

                scanf("\n");
                }
return 0;
}