#ABC130-E Common Subsequence
"""
問題：
整数列のリストが与えられる
空であるものも含めて、sとtの部分列として等しいものの個数を求めよ
解法：
LCSのmaxではなくsumのバージョンでかつ、
数え上げなので重複をなくさなければならない。
具体的には、
dp[i][j]:sをi文字目迄見た時のtをj文字目迄見た時に、
dp0:横方向(j方向)を優先して遷移した後に、縦方向(i方向)への遷移を行った時の合計
dp1:縦方向、横方向への遷移を行った時の合計
として、dp1[-1][-1]が答え。

"""
import sys
readline = sys.stdin.buffer.readline
def even(n): return 1 if n%2==0 else 0
n,m = map(int,readline().split())
s = list(map(int,readline().split())) + [-1]
t = list(map(int,readline().split())) + [-2]
mod = 10**9+7

#dp table
dp0 = [[0]*(m+2) for _ in range(n+2)]
dp1 = [[0]*(m+2) for _ in range(n+2)]
dp0[0][0] = 1
#process1
for i in range(n+1):
    for j in range(m+1):
        dp0[i+1][j] += dp0[i][j]%mod
        dp1[i][j] += dp0[i][j]%mod
        dp1[i][j+1] += dp1[i][j]%mod
        if s[i] == t[j]:
            dp0[i+1][j+1] += dp1[i][j]%mod


print(dp1[n][m]%mod) """
問題：
整数列のリストが与えられる
空であるものも含めて、sとtの部分列として等しいものの個数を求めよ
解法：
LCSのmaxではなくsumのバージョンでかつ、
数え上げなので重複をなくさなければならない。
具体的には、
dp[i][j]:sをi文字目迄見た時のtをj文字目迄見た時に、
dp0:横方向(j方向)を優先して遷移した後に、縦方向(i方向)への遷移を行った時の合計
dp1:縦方向、横方向への遷移を行った時の合計
として、dp1[-1][-1]が答え。

""" import sys sys readline = sys.stdin.buffer.readline readline sys.stdin.buffer.readline sys.stdin.buffer sys.stdin sys stdin buffer readline def even(n): return 1 if n%2==0 else 0 even n n n,m = map(int,readline().split()) n map(int,readline().split()) map int readline().split() ().split () readline split m s = list(map(int,readline().split())) + [-1] s list(map(int,readline().split())) + [-1] list(map(int,readline().split())) list map(int,readline().split()) map int readline().split() ().split () readline split [-1] -1 t = list(map(int,readline().split())) + [-2] t list(map(int,readline().split())) + [-2] list(map(int,readline().split())) list map(int,readline().split()) map int readline().split() ().split () readline split [-2] -2 mod = 10**9+7 mod 10**9+7 10**9 10 9 7 [0]*(m+2) for _ in range(n+2) for _ in range(n+2) _ range(n+2) range n+2 n 2 for _ in range(n+2) [0]*(m+2) [0] 0 m+2 m 2 dp0 = [[0]*(m+2) for _ in range(n+2)] dp0 [[0]*(m+2) for _ in range(n+2)] [0]*(m+2) for _ in range(n+2) for _ in range(n+2) _ range(n+2) range n+2 n 2 for _ in range(n+2) [0]*(m+2) [0] 0 m+2 m 2 dp1 = [[0]*(m+2) for _ in range(n+2)] dp1 [[0]*(m+2) for _ in range(n+2)] dp0[0][0] = 1 dp0[0][0] [0] dp0 0 0 1 for i in range(n+1):
    for j in range(m+1):
        dp0[i+1][j] += dp0[i][j]%mod
        dp1[i][j] += dp0[i][j]%mod
        dp1[i][j+1] += dp1[i][j]%mod
        if s[i] == t[j]:
            dp0[i+1][j+1] += dp1[i][j]%mod i range(n+1) range n+1 n 1 for j in range(m+1):
        dp0[i+1][j] += dp0[i][j]%mod
        dp1[i][j] += dp0[i][j]%mod
        dp1[i][j+1] += dp1[i][j]%mod
        if s[i] == t[j]:
            dp0[i+1][j+1] += dp1[i][j]%mod j range(m+1) range m+1 m 1 dp0[i+1][j] += dp0[i][j]%mod dp0[i+1][j] [i+1] dp0 i+1 i 1 j dp0[i][j]%mod dp0[i][j] [i] dp0 i j mod dp1[i][j] += dp0[i][j]%mod dp1[i][j] [i] dp1 i j dp0[i][j]%mod dp0[i][j] [i] dp0 i j mod dp1[i][j+1] += dp1[i][j]%mod dp1[i][j+1] [i] dp1 i j+1 j 1 dp1[i][j]%mod dp1[i][j] [i] dp1 i j mod if s[i] == t[j]:
            dp0[i+1][j+1] += dp1[i][j]%mod s[i] == t[j] s[i] s i t[j] t j dp0[i+1][j+1] += dp1[i][j]%mod dp0[i+1][j+1] [i+1] dp0 i+1 i 1 j+1 j 1 dp1[i][j]%mod dp1[i][j] [i] dp1 i j mod print(dp1[n][m]%mod) print dp1[n][m]%mod dp1[n][m] [n] dp1 n m mod s = list(map(int,readline().split())) + [-1] list(map(int,readline().split())) + [-1] s t = list(map(int,readline().split())) + [-2] list(map(int,readline().split())) + [-2] t dp0 = [[0]*(m+2) for _ in range(n+2)] [[0]*(m+2) for _ in range(n+2)] dp0 readline = sys.stdin.buffer.readline sys.stdin.buffer.readline readline dp1 = [[0]*(m+2) for _ in range(n+2)] [[0]*(m+2) for _ in range(n+2)] dp1 mod = 10**9+7 10**9+7 mod def even(n): return 1 if n%2==0 else 0 def even(n): return 1 if n%2==0 else 0 even m = map(int,readline().split()) map(int,readline().split()) m n,m = map(int,readline().split()) map(int,readline().split()) n
#ABC130-E Common Subsequence
"""
問題：
整数列のリストが与えられる
空であるものも含めて、sとtの部分列として等しいものの個数を求めよ
解法：
LCSのmaxではなくsumのバージョンでかつ、
数え上げなので重複をなくさなければならない。
具体的には、
dp[i][j]:sをi文字目迄見た時のtをj文字目迄見た時に、
dp0:横方向(j方向)を優先して遷移した後に、縦方向(i方向)への遷移を行った時の合計
dp1:縦方向、横方向への遷移を行った時の合計
として、dp1[-1][-1]が答え。

"""
import sys
readline = sys.stdin.buffer.readline
def even(n): return 1 if n%2==0 else 0
n,m = map(int,readline().split())
s = list(map(int,readline().split())) + [-1]
t = list(map(int,readline().split())) + [-2]
mod = 10**9+7

#dp table
dp0 = [[0]*(m+2) for _ in range(n+2)]
dp1 = [[0]*(m+2) for _ in range(n+2)]
dp0[0][0] = 1
#process1
for i in range(n+1):
    for j in range(m+1):
        dp0[i+1][j] += dp0[i][j]%mod
        dp1[i][j] += dp0[i][j]%mod
        dp1[i][j+1] += dp1[i][j]%mod
        if s[i] == t[j]:
            dp0[i+1][j+1] += dp1[i][j]%mod


print(dp1[n][m]%mod)
