#include using namespace std; using i64 = long long; template using vec = vector; // 多次元配列は vec dp(n1, vec(n2, vec(n3, init_val))) のように書けるよ(型推論) template inline bool chmax(T &a, const S &b) { return (a < b ? a = b, 1 : 0); } template inline bool chmin(T &a, const S &b) { return (a > b ? a = b, 1 : 0); } template std::ostream &operator<<(std::ostream &os, const std::pair &pair) { os << "(" << pair.first << ", " << pair.second << ")"; return os; } template std::ostream &operator<<(std::ostream &os, const std::tuple &t) { os << "("; [&](std::index_sequence) { ((os << (I == 0 ? "" : ", ") << std::get(t)), ...); }(std::index_sequence_for{}); os << ")"; return os; } // `std::ostream << T` が利用可能かどうかをチェック template struct is_ostream_writable : std::false_type {}; template struct is_ostream_writable< T, std::void_t() << std::declval())>> : std::true_type {}; template constexpr bool is_ostream_writable_v = is_ostream_writable::value; // イテラブルのものを出力できるようにする template requires(!is_ostream_writable_v) std::ostream &operator<<(std::ostream &os, const R &range) { os << "["; for (auto it = range.begin(); it != range.end(); it++) { os << *it; if (next(it) != range.end()) { os << ", "; } } os << "]"; return os; } template void debug_var(const char *var_name, const T &a) { cerr << var_name << " = " << a << endl; } #ifdef DEBUG_MODE #define DEBUG_VAR(var) debug_var(#var, var) #else #define DEBUG_VAR(var) #endif #define REP(i, n) for (i64 i = 0; i < (i64)(n); i++) int main() { i64 N, K; cin >> N >> K; K--; string t; cin >> t; if (N == 1) { char ans = 'a' + (t[0] - '0') - 1; cout << ans << endl; return 0; } // [i..n)を復号したときにあり得る数 vec dp(N + 1, 0); dp[N] = 1; dp[N - 1] = t[N - 1] == '0' ? 0 : 1; for (i64 i = N - 2; i >= 0; i--) { if (t[i] == '1') { dp[i] = dp[i + 1] + dp[i + 2]; } else if (t[i] == '2' && t[i + 1] <= '6') { dp[i] = dp[i + 1] + dp[i + 2]; } else if (t[i] == '0') { dp[i] = 0; } else { dp[i] = dp[i + 1]; } dp[i] = min(dp[i], K + 1); } DEBUG_VAR(dp); string ans; i64 i = 0; while (i < N) { if (i == N - 1) { assert(t[i] >= '1' && t[i] <= '9'); ans += 'a' + (t[i] - '0') - 1; break; } if (K >= dp[i + 1]) { K -= dp[i + 1]; ans += 'a' + stoi(t.substr(i, 2)) - 1; i += 2; } else { assert(t[i] >= '1' && t[i] <= '9'); ans += 'a' + (t[i] - '0') - 1; i += 1; } } cout << ans << endl; }