#include<iostream>
using namespace std;
int f(int m, int n) {   //使用递归的方式 当只有一个盘子 或者没有苹果的时候函数返回一种结果(一个苹果的时候,即返回f(1,1)为1) 
    if ((m == 0) || (n == 1)) return 1;
    if (n > m) return f(m, m);
    else return f(m, n - 1) + f(m - n, n);
}//这个递归公式的核心思想是将问题分解为更小的子问题来解决。我们可以将将m个苹果放入n个盘子中的方案分为两类:一类是至少有一个盘子为空,另一类是每个盘子都至少有一个苹果。对于第一类方案,我们可以将问题转化为将m个苹果放入n-1个盘子中,因为至少有一个盘子是空的。因此,这一类方案的数量就是f(m,n-1)。对于第二类方案,我们可以先在每个盘子中放一个苹果,然后再考虑如何将剩下的m-n个苹果放入n个盘子中。这样,这一类方案的数量就是f(m-n,n)。


int main() {
    int m, n;
    while (cin >> m >> n) {
        cout << f(m, n) << endl;//迭代运算即可
    }
    return 0;
}