// In the name of Allah.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
struct ModInt {
int x;
bool operator==(const ModInt& rhs) const {
return x == rhs.x;
}
bool operator!=(const ModInt& rhs) const {
return !(rhs == *this);
}
ModInt(ll x = 0) : x(((x % MOD) + MOD) % MOD) {
}
friend ModInt operator+(const ModInt& l, const ModInt& r) {
return l.x + r.x;
}
ModInt& operator+=(const ModInt& o) {
return *this = *this + o;
}
friend ModInt operator-(const ModInt& l, const ModInt& r) {
return l.x - r.x;
}
ModInt operator-() const {
return -x;
}
ModInt& operator-=(const ModInt& o) {
return *this = *this - o;
}
friend ModInt operator*(const ModInt& l, const ModInt& r) {
return (ll)l.x * r.x;
}
ModInt& operator*=(const ModInt& o) {
return *this = *this * o;
}
ModInt pow(ll b) const {
ModInt ans = 1;
ModInt a = *this;
for (; b; b >>= 1, a = a * a)
if (b & 1)
ans *= a;
return ans;
}
ModInt rev() const {
return pow(MOD - 2);
}
friend ModInt operator/(const ModInt& l, const ModInt& r) {
return l * r.rev();
}
ModInt& operator/=(const ModInt& o) {
return *this = *this / o;
}
friend ostream& operator<<(ostream& os, const ModInt& anInt) {
os << anInt.x;
return os;
}
};
const int MAX_N = 2e2 + 14, D = 10;
int n, k;
ModInt cache[2][D][D][D][D][2 * D], zero, one = 1;
ModInt dp(int n, int last, int max_streak, int streak_l, int streak_r);
ModInt& dp(int n, int last, int l, int r, int max_streak, int streak) {
if (last < 0 || last >= D)
return zero;
if (n == 1)
return streak == 0 && l <= last && last <= r ? one : zero;
return cache[n & 1][last][l][r][max_streak][streak + D];
}
ModInt dp(int n, int last, int l, int r, int max_streak, int streak_l, int streak_r) {
ModInt ans = 0;
for (int s = streak_l; s <= streak_r; ++s)
ans += dp(n, last, l, r, max_streak, s);
return ans;
}
ModInt dp(int n, int last, int l, int r, int max_streak) {
return dp(n, last, l, r, max_streak, -max_streak, max_streak) - (max_streak
? dp(n, last, l, r, max_streak - 1,
-max_streak + 1, max_streak - 1)
: 0);
}
ModInt dp_pure(int n, int last, int l, int r, int max_streak) {
assert(l <= r);
if (l == r)
return dp(n, last, l, r, max_streak);
return dp(n, last, l, r, max_streak) - dp(n, last, l + 1, r, max_streak) - dp(n, last, l, r - 1, max_streak) + dp(
n, last, l + 1, r - 1, max_streak);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k;
for (int i = 2; i <= n; ++i) {
fill(cache[i & 1][0][0][0][0], cache[(i & 1) + 1][0][0][0][0], ModInt());
for (int l = 0; l < D; ++l)
for (int r = 0; r < D; ++r)
for (int last = i == n ? 0 : l; last <= (i == n ? D - 1 : r); ++last)
for (int max_streak = 0; max_streak < D; ++max_streak)
for (int streak = -max_streak; streak <= max_streak; ++streak) {
ModInt& ans = dp(i, last, l, r, max_streak, streak);
if (streak > 1)
ans = dp(i - 1, last - 1, l, r, max_streak, streak - 1);
else if (streak < -1)
ans = dp(i - 1, last + 1, l, r, max_streak, streak + 1);
else if (streak == 0)
ans = dp(i - 1, last, l, r, max_streak, -max_streak, max_streak);
else if (streak == 1)
ans = dp(i - 1, last - 1, l, r, max_streak, -max_streak, 0);
else if (streak == -1)
ans = dp(i - 1, last + 1, l, r, max_streak, 0, max_streak);
}
}
ModInt ans;
for (int i = 0; i < D; ++i) {
for (int row_streak = -D + 1; row_streak < D; ++row_streak)
for (int col_streak = -D + 1; col_streak < D; ++col_streak)
if ((row_streak + 1) * (col_streak + 1) <= k)
for (int l = 0; l < D; ++l)
for (int r = l; r < D; ++r) {
int cl = max(0, i - l), cr = min(D - 1, D - 1 + i - r);
ans += dp_pure(n, i, l, r, row_streak) * dp(n, i, cl, cr, col_streak);
}
}
cout << ans << '\n';
}