#include <iostream>
#include <vector>
using namespace std;
/*
思路:
1.边界:0个苹果 1种放法 ;1个苹果 一种放法 ;一个盘子 一种放法
2.状态转移方程:
a. 苹果数 > 盘子数(m > n) dp[m][n] 表示m个苹果n个盘子的放法数
dp[m][n] = dp[m][n-1] + dp[m-n][n]
分为空一个盘子的放法 + 每个盘子都有苹果的放法
而每个盘子都放了一个苹果后 等同于 剩余m-n个苹果放盘
b. 苹果数 <= 盘子数(m <= n) dp[m][n] = dp[m][m];
*/
int main() {
int m,n;
cin >> m >> n;
if(m <= n) n = m;//当盘子数多于苹果数时,多余盘子无作用
vector<vector<int> > dp(m+1,vector<int>(n+1,0));
for(int i = 0; i <= m; ++i){
for(int j = 0; j <=n; ++j){
if(i == 0 || i == 1 || j == 1){//边界:0苹果 1苹果 1盘子
dp[i][j] = 1;
continue;
}
if(i >= j) dp[i][j] = dp[i][j-1] + dp[i-j][j];//放置时苹果多余盘子
else dp[i][j] = dp[i][i];//放置时苹果少于盘子
}
}
cout << dp[m][n] << endl;
}
// 64 位输出请用 printf("%lld")