fn getline() -> String { let mut ret = String::new(); std::io::stdin().read_line(&mut ret).unwrap(); ret } fn main() { let ints = getline() .split_whitespace() .map(|x| x.parse::().unwrap()) .collect::>(); let k = ints[1]; let t = getline().trim().bytes().map(|i| i - b'0').collect::>(); let n = t.len(); let mut dp = vec![0i64; n + 1]; dp[n] = 1; for i in (0..n).rev() { let mut me = 0i64; if t[i] != 0 { me = me.saturating_add(dp[i + 1]); } if i + 2 <= n { let val = t[i] * 10 + t[i + 1]; if 10 <= val && val <= 26 { me = me.saturating_add(dp[i + 2]); } } dp[i] = me.min(k + 1); } let mut ans = "".to_string(); let mut rem = k - 1; let mut i = 0; while i < n { let one = if t[i] == b'0' { 0 } else { dp[i + 1] }; if rem < one { ans.push((b'a' + t[i] - 1) as char); } else { rem -= one; let val = if i + 2 <= n { t[i] * 10 + t[i + 1] } else { panic!() }; if 10 <= val && val <= 26 { ans.push((b'a' + val - 1) as char); i += 1; } else { panic!(); } } i += 1; } assert_eq!(rem, 0); println!("{ans}"); }