Cod sursa(job #2253636)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 4 octombrie 2018 11:05:14
Problema Planeta Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;

long long c[35];
int x[35];
long long k;

void solve(int n, long long inm, int v[]) {
  if (n == 0)
    return ;
  long long ans = 0;
  int last = n;
  for (int i = 1; i <= n; ++i) {
    ans += c[i - 1] * c[n - i];
    if (inm * ans >= k) {
      last = i;
      break;
    }
  }
  int last1 = last;
  last = v[last];
  printf("%d ", last);
  last = last1;
  for (int i = 1; i < last; ++i)
    k -= inm * c[i - 1] * c[n - i];
  for (int i = 1; i < last; ++i)
    x[i] = v[i];
  solve(last - 1, inm * c[n - last], x);
  for (int i = last + 1; i <= n; ++i)
    x[i - last] = v[i];
  solve(n - last, inm, x);
}

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

  c[0] = 1;
  c[1] = 1;
  for (int i = 2; i <= 30; ++i)
    c[i] = i * c[i - 1] * 2 * (2 * i - 1) / (i * (i + 1));
  /*for (int i = 1; i <= 30; ++i)
    printf("%lld\n", c[i]);*/
  int n;
  scanf("%d", &n);
  scanf("%lld", &k);
  for (int i = 1; i <= n; ++i)
    x[i] = i;
  solve(n, 1, x);
  return 0;
}