#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' : ' ');
}