#include #include #include #include #include #include #include #include #include #include #include #define int long long typedef long long llong; const int MAXM = 100000 + 10; const int MOD = 1e9 + 7; const int MAXN = 35 + 5; const int INTINF = 1e9; const llong INF = 1e12; int n; int dp[MAXN][MAXM][2]; int calced[MAXM]; int calc(int m) { if (n == 1) { return m; } if (calced[m] != -1) { return calced[m]; } for (int i = 1 ; i <= m ; ++i) { dp[n][i][0] = dp[n][i][1] = 1; } dp[n][0][0] = dp[n][0][1] = 0; dp[n][m + 1][0] = dp[n][m + 1][1] = 0; for (int pos = n - 1 ; pos >= 1 ; --pos) { dp[pos][0][0] = dp[pos][0][1] = dp[pos][m + 1][0] = dp[pos][m + 1][1] = 0; for (int val = m ; val >= 1 ; --val) { dp[pos][val][1] = dp[pos + 1][val + 1][0] + dp[pos][val + 1][1]; if (dp[pos][val][1] >= MOD) dp[pos][val][1] -= MOD; } for (int val = 1 ; val <= m ; ++val) { dp[pos][val][0] = dp[pos + 1][val - 1][1] + dp[pos][val - 1][0]; if (dp[pos][val][0] >= MOD) dp[pos][val][0] -= MOD; } } calced[m] = 0; for (int i = 1 ; i <= m ; ++i) { calced[m] += dp[1][i][0]; if (calced[m] >= MOD) calced[m] -= MOD; calced[m] += dp[1][i][1]; if (calced[m] >= MOD) calced[m] -= MOD; } return calced[m]; } bool bl[MAXM]; int dp2[MAXM]; int f(int m) { if (bl[m]) { return dp2[m]; } bl[m] = true; dp2[m] = calc(m); for (int i = 2 ; i <= m ; ++i) { dp2[m] += MOD - f(m / i); if (dp2[m] >= MOD) dp2[m] -= MOD; } return dp2[m]; } int m; void solve() { for (int i = 1 ; i <= m ; ++i) { calced[i] = -1; } std::cout << f(m) << '\n'; } void input() { std::cin >> n >> m; } void fastIOI() { freopen("mountains.in", "r", stdin); freopen("mountains.out", "w", stdout); std::ios_base :: sync_with_stdio(0); std::cout.tie(nullptr); std::cin.tie(nullptr); } signed main() { fastIOI(); input(); solve(); return 0; }