Cod sursa(job #749079)

Utilizator danalex97Dan H Alexandru danalex97 Data 15 mai 2012 18:55:23
Problema Planeta Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
/*
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const int MAX_N = 20;

int n, K;
vector<int> v;

bool valid(int st, int dr)
{
	if (st >= dr) return true;
	
	int m;
	for (m = st + 1; m <= dr; ++m)
		if (v[m] > v[st]) breaK;
	for (int i = m; i <= dr; ++i)
		if (v[i] < v[st]) return false;
	return valid(st + 1, m-1) && valid(m, dr);
}

int main() 
{
	freopen("planeta.in", "r", stdin);
	freopen("planeta.out", "w", stdout);

	int K2;
	scanf("%d %d", &n, &K2);

	for (K=1;K<=K2;++K)
	{
	for (int i = 1; i <= n; ++i)
		v.push_bacK(i);
	
	int cnt = 0;
	do {if (valid(0, n-1)) ++cnt;
		if (cnt == K) breaK;     }
	while (next_permutation(v.begin(), v.end()));
	
	for (int i = 0; i < n; ++i)
		printf("%d ", v[i]);
	printf("\n");
	
	for (int i = 1; i <= n; ++i)
		v.pop_bacK();
	}
}
*/

#include<cstdio>

long long Best[35];

void Solve(long long x,long long y,long long K)
{
    if (x>y) return;
	if (x==y){printf("%lld ",x);return;}
	
    long long p=0,i;
    for( i=x;i<=y;++i )
        if( ( p+=Best[i-x]*Best[y-i] ) >= K )
        {
            p-=Best[i-x]*Best[y-i];
            break;
        }
    printf("%lld ",i);
    
	Solve( x,i-1, (K-p-1)/Best[y-i]+1 );
    Solve( i+1,y, (K-p-1)%Best[y-i]+1 );
}

int main()
{
    long long n,i,j,K;
	
    freopen("planeta.in","r",stdin);
    freopen("planeta.out","w",stdout);
    
	scanf("%lld%lld",&n,&K);
    
	Best[0]=1;
    
	for( i=1;i<=n;++i )
        for( j=0;j<i;++j )
            Best[i]+=Best[j]*Best[i-j-1];
    
	Solve(1,n,K);
    
	printf("\n");
	
    return 0;
}