#include<bits/stdc++.h>
using namespace std;
// //方法一:DFS
// int push_apple(int m,int n)
// {
//     if(m==0) return 1;//零个苹果,方法一种
//     if(n==0) return 0;//零个盘子,方法零种
//     if(m<n) return push_apple(m,m);//苹果少于盘子,n-m个盘子没用
//     else return push_apple(m,n-1)+push_apple(m-n,n);//只有两种可能,要么至少有一个盘子为空push_apple(m,n-1),要么每个盘子都至少有一个苹果push_apple(m-n,n)
// }
// int main()
// {
//     int m,n;
//     while(cin>>m>>n)
//     {
//         cout<<push_apple(m,n);//m个苹果放进n个盘子
//     }
// }
//方法二:动态规划
int main()
{
    int m,n;
    while(cin>>m>>n)
    {
        int dp[m+1][n+1];//dp[i][j]代表i+1个苹果放进j+1个盘子的分法
        //dp初始化
        for(int i=0;i<=m;i++)
        {
            for(int j=0;j<=n;j++)
            {
                dp[i][j]=0;
            }
        }
        //如果苹果是零个,无论盘子几个,方法都只有一个,那就是每个盘子都不装
        for(int i=0;i<=n;i++) dp[0][i]=1;
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                //苹果少于盘子,n-m个盘子没用
                if(i<j) dp[i][j]=dp[i][i];
                //否则。只有两种可能,要么至少有一个盘子为空push_apple(m,n-1),要么每个盘子都至少有一个苹果push_apple(m-n,n)
                else dp[i][j]=dp[i][j-1]+dp[i-j][j];
            }
        }
        cout<<dp[m][n]<<endl;
    }
}