Cod sursa(job #2253626)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 4 octombrie 2018 10:53:16
Problema Planeta Scor 30
Compilator cpp Status done
Runda shimulare_shmecheri Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

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

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

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

  c[0] = 1;
  c[1] = 1;
  for (unsigned long long i = 2; i <= 30; ++i)
    c[i] = i * c[i - 1] * 2 * (2 * i - 1) / (i * (i + 1));
  /*for (unsigned long long i = 1; i <= 30; ++i)
    prunsigned long longf("%lld\n", c[i]);*/
  unsigned long long n;
  scanf("%llu", &n);
  scanf("%llu", &k);
  for (unsigned long long i = 1; i <= n; ++i)
    x[i] = i;
  solve(n, 1, x);
  return 0;
}