Cod sursa(job #254545)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 7 februarie 2009 12:53:35
Problema Planeta Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1 kb
#include<stdio.h>
#define tip unsigned long long
tip n,k,i,j,arb[32],sol[32],real[32],poz,ret,getpoz(),getval(),lsol,val,h,p,s,nn;
void readd(),calc_arb(int ii),solve(),prints();
int main()
{
	readd();
	solve();
	prints();
	return 0;
}
void readd()
{
	freopen("planeta.in","r",stdin);
	freopen("planeta.out","w",stdout);
	scanf("%llu%llu",&n,&k);nn=n,arb[0]=1;
	for(i=1;i<=n;i++)real[i]=i;
}
void calc_arb(tip ii)
{
	for(j=0;j<ii;j++)arb[ii]+=arb[j]*arb[ii-j-1];
}
void solve()
{
	for(i=1;;i++){calc_arb(i);if(arb[i]>k)break;}
	while(n>i){poz=1;val=getval();sol[++lsol]=val;n--;}
	while(n)
	{ poz=getpoz();
	  val=getval();
	  sol[++lsol]=val;
	  n--;
	}
}
tip getpoz()
{
	if(arb[n-1]>k)return 1;
	s=0;for(j=0,h=n-1;j<n;j++,h--){s+=arb[j]*arb[h];if(s>k)break;}
	ret=j+1;p=j;s-=arb[j]*arb[h];k-=s;
	return ret;
}
tip getval()
{
	ret=real[poz];for(j=poz;j<=n;j++)real[j]=real[j+1];return ret;
}
void prints()
{
	for(i=1;i<=nn;i++)printf("%llu ",sol[i]);
	printf("\n");
}