#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;
}
}