#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T SQR(T x) {
  return x * x;
}
template <typename T>
inline T MIN(T x, T y) {
  return (x < y) ? x : y;
}
template <typename T>
inline T MAX(T x, T y) {
  return (x > y) ? x : y;
}
template <typename T>
inline T ABS(T x) {
  return (x > 0) ? x : -x;
}
template <typename T>
inline void UPDATE_MIN(T& x, T y) {
  if (y < x) {
    x = y;
  }
}
template <typename T>
inline void UPDATE_MAX(T& x, T y) {
  if (x < y) {
    x = y;
  }
}
template <typename T>
inline int ARGMAX(T cont) {
  return max_element(cont.begin(), cont.end()) - cont.begin();
}
template <typename T>
inline int ARGMIN(T cont) {
  return min_element(cont.begin(), cont.end()) - cont.begin();
}
vector<string> split(const string& s, char c) {
  vector<string> v;
  stringstream ss(s);
  string x;
  while (getline(ss, x, c)) v.emplace_back(x);
  return move(v);
}
template <typename T, typename... Args>
inline string arrStr(T arr, int n) {
  stringstream s;
  s << "[";
  for (__typeof(n - 1) i = (0), __tmpvar__end69 = (n - 1); i < __tmpvar__end69;
       i++)
    s << arr[i] << ",";
  s << arr[n - 1] << "]";
  return s.str();
}
template <class T>
inline string TOSTR(const T& x) {
  stringstream ss;
  ss << x;
  return ss.str();
}
inline int gcd(int a, int b) { return a ? gcd(b % a, a) : b; }
inline long long gcd(long long a, long long b) { return a ? gcd(b % a, a) : b; }
inline long long powmod(long long a, long long p, long long m) {
  long long r = 1;
  while (p) {
    if (p & 1) r = r * a % m;
    p >>= 1;
    a = a * a % m;
  }
  return r;
}
struct pairhash {
  template <typename T, typename U>
  std::size_t operator()(const std::pair<T, U>& x) const {
    return std::hash<T>()(x.first) ^ std::hash<U>()(x.second);
  }
};
template <typename K, typename V>
V GetWithDef(const std::unordered_map<K, V>& m, const K& key, const V& defval) {
  auto it = m.find(key);
  return (it == m.end()) ? defval : it->second;
}
template <typename K, typename V>
void SetDef(std::unordered_map<K, V>& m, const K& key, const V& defval) {
  auto it = m.find(key);
  if (it == m.end()) m[key] = defval;
}
const int MOD = 1000 * 1000 * 1000 + 7;
const double PI = 3.1415926535897932384626433832795l;
unsigned long long N, K;
unsigned long long num[55] = {};
int perm[55] = {};
int main() {
  ios_base::sync_with_stdio(0);
  cin >> N >> K;
  K--;
  num[0] = 1;
  num[1] = 1;
  for (__typeof(N + 1) n = (2), __tmpvar__end166 = (N + 1);
       n < __tmpvar__end166; n++) {
    num[n] = num[n - 1] + num[n - 2];
    if (num[n] > (1e18 + 1e17)) num[n] = (1e18 + 1e17);
    1;
  }
  long long base = 0;
  int pos = 0;
  while (pos < N) {
    long long max1 = num[N - pos - 1];
    assert(base <= K);
    1;
    if (K < base + max1) {
      1;
      perm[pos + 1] = pos + 1;
      pos += 1;
    } else {
      1;
      perm[pos + 1] = pos + 2;
      perm[pos + 2] = pos + 1;
      pos += 2;
      base += max1;
      assert(base <= K);
    }
  }
  for (__typeof(N + 1) i = (1), __tmpvar__end192 = (N + 1);
       i < __tmpvar__end192; i++) {
    printf("%d ", perm[i]);
  }
}
