#include <iostream> #include <iomanip> #include <cassert> #include <vector> #include <algorithm> #include <utility> const int MAX = 1000; long long C[MAX][MAX]; int N, p; int main() { std::cin.tie(nullptr)->sync_with_stdio(false); for (int i = 0 ; i < MAX ; i++) for (int j = 0 ; j < MAX ; j++) C[i][j] = -1; std::cin >> N >> p; if (p == 1) { std::cout << N << '\n'; std::exit(0); } if (p == 2) { for (int i = 2 ; i < 21000 ; i++) for (int j = 1 ; j < i ; j++) { long long v = (long long)i * (i - 1) / 2 + j; if (v == N) { std::cout << i << ' ' << j << '\n'; std::exit(0); } } for (int i = 2 ; i < 21000 ; i++) { long long v = i * (i - 1) / 2; // std::cout << v << std::endl; if (v == N) { std::cout << i << '\n'; std::exit(0); } } assert(false); } for (int i = 0 ; i < MAX ; i++) C[i][0] = C[i][i] = 1; for (int i = 0 ; i < MAX ; i++) for (int j = 1 ; j < i ; j++) { if (C[i - 1][j - 1] == -1 or C[i - 1][j] == -1) C[i][j] = -1; else C[i][j] = C[i - 1][j - 1] + C[i - 1][j]; if (C[i][j] > N) C[i][j] = -1; } std::vector<int> ans; auto rec = [&](auto rec, long long n, int last, int i) -> bool { assert(n >= 0); assert(i >= 0); if (n == 0) return true; if (i == 0) return false; for (int j = i ; j < last ; j++) if (C[j][i] != -1 and C[j][i] <= n) { n -= C[j][i]; ans.push_back(j); if (rec(rec, n, j, i - 1)) return true; ans.pop_back(); n += C[j][i]; } return false; }; assert(rec(rec, N, MAX - 1, p)); // std::reverse(ans.begin(), ans.end()); for (int i = 0 ; i < (int)ans.size() ; i++) std::cout << ans[i] << (i + 1 == (int)ans.size() ? '\n' : ' '); }