f = {}
dp = {}
def get_f(n):
if n in f:
return f[n]
if n == 0:
return 1
res = 0
for i in range(0, n):
res += get_f(i) * get_f(n - 1 - i)
f[n] = res
return res
def get_dp(n, h):
if (n, h) in dp:
return dp[n, h]
if h > n:
return 0
if n <= 1:
return 1
res = 0
for i in range(0, n):
res += get_dp(i, h - 1) * get_f(n - i - 1) + \
get_dp(n - i - 1, h - 1) * get_f(i) - \
get_dp(i, h - 1) * get_dp(n - i - 1, h - 1)
dp[n, h] = res
return res
n, h = map(int, input().split())
print(get_dp(n, h))
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, k;
cin >> n >> k;
long long d[n+1][n+1];
memset(d, 0, sizeof(d));
d[0][0] = d[1][1] = 1;
for(int i=2; i <= n; i++){
for(int j=2; j <= n; j++){
for(int o=0; o<i; o++){
long long l=0, r=0;
for(int h=0; h<j; h++){
l += d[o][h], r += d[i-o-1][h];
}
d[i][j] += l * d[i-o-1][j-1] - d[i-o-1][j-1] * d[o][j-1] + r * d[o][j-1];
}
}
}
long long wa=0;
for(int i=k; i <= n; i++) wa += d[n][i];
cout << wa;
return 0;
}
17A - Noldbach problem | 1350A - Orac and Factors |
1373A - Donut Shops | 26A - Almost Prime |
1656E - Equal Tree Sums | 1656B - Subtract Operation |
1656A - Good Pairs | 1367A - Short Substrings |
87A - Trains | 664A - Complicated GCD |
1635D - Infinite Set | 1462A - Favorite Sequence |
1445B - Elimination | 1656C - Make Equal With Mod |
567A - Lineland Mail | 1553A - Digits Sum |
1359B - New Theatre Square | 766A - Mahmoud and Longest Uncommon Subsequence |
701B - Cells Not Under Attack | 702A - Maximum Increase |
1656D - K-good | 1426A - Floor Number |
876A - Trip For Meal | 1326B - Maximums |
1635C - Differential Sorting | 961A - Tetris |
1635B - Avoid Local Maximums | 20A - BerOS file system |
1637A - Sorting Parts | 509A - Maximum in Table |