use proconio::input; use proconio::fastout; use std::cmp::min; const INF: usize = 1_000_000_000_000_000_100; #[fastout] #[allow(non_snake_case)] fn main() { input! { (mut N, mut K): (usize, usize), } N = min(N, 162); K += 1; let mut DP = vec![vec![vec![0; N+1]; 10]]; DP[0][0][0] = 1; for i in 0..100_000 { let mut DP2 = vec![vec![0; N+1]; 10]; for j in 0..=9 { for k in 0..=N { for l in 0..=9 { if k + l <= N { DP2[l][k+l] = min(DP[i][j][k] + DP2[l][k+l], INF); } } } } let mut sum = 0; for j in 0..=9 { for k in 0..=N { sum += DP2[j][k]; } } DP.push(DP2); if sum >= K { break; } } let M = DP.len(); for i in 0..M { for j in 0..=9 { for k in 0..N { DP[i][j][k+1] = min(DP[i][j][k] + DP[i][j][k+1], INF); } } } let mut ans = Vec::new(); for i in (1..M).rev() { for j in 0..=9 { if DP[i][j][N] < K { K -= DP[i][j][N]; } else { ans.push(j); N -= j; break; } } } println!("{}", ans.iter().map(|&x| x.to_string()).collect::>().join("")); }