import sys

read = sys.stdin.buffer.read

readline = sys.stdin.buffer.readline

readlines = sys.stdin.buffer.readlines



import numpy as np



MOD = 10**9 + 7



N,K = list(map(int,read().split()))



# 左からの流入量、コスト

L = N*(N-1)//2+1

dp = np.zeros((N,L),dtype=np.int64)

dp[0,0] = 1



for _ in range(1,N+1):

    prev = dp

    dp = np.zeros_like(prev)

    for n in range(N):

        # 自身を不動点にしてそのまま左右に流す

        dp[n,n:] += prev[n,:L-n]

        # 左からのものを採用、自身は左に流す

        if n > 0: dp[n-1,n-1:] += prev[n,:L-n+1] * n

        # 左からのものを採用、自身は右に流す

        dp[n,n:] += prev[n,:L-n] * n

        # 右からのものを採用、自身は左に流す

        dp[n,n:] += prev[n,:L-n] * n

        # 右からのものを採用、自身は右に流す

        if n+1 < N: dp[n+1,n+1:] += prev[n,:L-n-1] * (n+1)

    dp %= MOD



x = dp[0]

if K&1:

    answer = 0

elif K//2 < L:

    answer = x[K//2]

else:

    answer = 0

print(answer)
import sys

read = sys.stdin.buffer.read

readline = sys.stdin.buffer.readline

readlines = sys.stdin.buffer.readlines



import numpy as np



MOD = 10**9 + 7



N,K = list(map(int,read().split()))



# 左からの流入量、コスト

L = N*(N-1)//2+1

dp = np.zeros((N,L),dtype=np.int64)

dp[0,0] = 1



for _ in range(1,N+1):

    prev = dp

    dp = np.zeros_like(prev)

    for n in range(N):

        x = prev[n]

        # どれかを不動点に残りを等個数だけ左右に流す

        dp[n,n:] += x[:L-n] * (n+n+1)

        # 左からのものを採用、自身は左に流す

        if n > 0: dp[n-1,n-1:] += x[:L-n+1] * n

        # 右からのものを採用、自身は右に流す

        if n+1 < N: dp[n+1,n+1:] += x[:L-n-1] * (n+1)

    dp %= MOD



x = dp[0]

if K&1:

    answer = 0

elif K//2 < L:

    answer = x[K//2]

else:

    answer = 0

print(answer)
import sys

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
import numpy as np

MOD = 10**9 + 7
N, K = list(map(int, read().split()))
# 左からの流入量、コスト
L = N * (N - 1) // 2 + 1
dp = np.zeros((N, L), dtype=np.int64)
dp[0, 0] = 1
for _ in range(1, N + 1):
    prev = dp
    dp = np.zeros_like(prev)
    for n in range(N):
        # 自身を不動点にしてそのまま左右に流す
        dp[n, n:] += prev[n, : L - n]
        # 左からのものを採用、自身は左に流す
        if n > 0:
            dp[n - 1, n - 1 :] += prev[n, : L - n + 1] * n
        # 左からのものを採用、自身は右に流す
        dp[n, n:] += prev[n, : L - n] * n
        # 右からのものを採用、自身は左に流す
        dp[n, n:] += prev[n, : L - n] * n
        # 右からのものを採用、自身は右に流す
        if n + 1 < N:
            dp[n + 1, n + 1 :] += prev[n, : L - n - 1] * (n + 1)
    dp %= MOD
x = dp[0]
if K & 1:
    answer = 0
elif K // 2 < L:
    answer = x[K // 2]
else:
    answer = 0
print(answer)

import sys

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
import numpy as np

MOD = 10**9 + 7
N, K = list(map(int, read().split()))
# 左からの流入量、コスト
L = N * (N - 1) // 2 + 1
dp = np.zeros((N, L), dtype=np.int64)
dp[0, 0] = 1
for _ in range(1, N + 1):
    prev = dp
    dp = np.zeros_like(prev)
    for n in range(N):
        x = prev[n]
        # どれかを不動点に残りを等個数だけ左右に流す
        dp[n, n:] += x[: L - n] * (n + n + 1)
        # 左からのものを採用、自身は左に流す
        if n > 0:
            dp[n - 1, n - 1 :] += x[: L - n + 1] * n
        # 右からのものを採用、自身は右に流す
        if n + 1 < N:
            dp[n + 1, n + 1 :] += x[: L - n - 1] * (n + 1)
    dp %= MOD
x = dp[0]
if K & 1:
    answer = 0
elif K // 2 < L:
    answer = x[K // 2]
else:
    answer = 0
print(answer)

-        # 自身を不動点にしてそのまま左右に流す -        dp[n, n:] += prev[n, : L - n] +        x = prev[n] +        # どれかを不動点に残りを等個数だけ左右に流す +        dp[n, n:] += x[: L - n] * (n + n + 1) -            dp[n - 1, n - 1 :] += prev[n, : L - n + 1] * n -        # 左からのものを採用、自身は右に流す -        dp[n, n:] += prev[n, : L - n] * n -        # 右からのものを採用、自身は左に流す -        dp[n, n:] += prev[n, : L - n] * n +            dp[n - 1, n - 1 :] += x[: L - n + 1] * n -            dp[n + 1, n + 1 :] += prev[n, : L - n - 1] * (n + 1) +            dp[n + 1, n + 1 :] += x[: L - n - 1] * (n + 1)