Cod sursa(job #109692)
Utilizator | 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;
}