N,M = map(int, input().split())
S = list(map(int, input().split()))
T = list(map(int, input().split()))

# dp[i][j] : Sのi-1文字目、Tのj-1文字目までの解(文字目は0-index)
dp = [[0 for _ in range(M+1)] for _ in range(N+1)]
#print(dp)
MOD = 10 ** 9 + 7

# なぜこれでよいのかわからない。。。
for i in range(1,N+1):
  for j in range(1,M+1):
    if S[i-1] == T[j-1]:
      # Sのi-1文字目、Tのj-1文字目が一致している場合は、
      # Sのi-2文字目、Tのj-2文字目までの部分列それぞれ
      # Sのi-1文字目、Tのj-1文字目を追加したものと、
      # Sのi-1文字目だけ、Tのj-1文字目だけの部分列パターンが
      # 増えるということだろうか。
      # つまり
      # dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1] + (dp[i-1][j-1] + 1)
      #            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      #            ここはS[i-1] != T[j-1]のときと同じ。
      # ということか？
      dp[i][j] = dp[i][j-1] + dp[i-1][j] + 1
    else:
      # dp[i-1][j-1]を引いているのは重複部分の排除？
      dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1]
    #print(i,j,dp[i][j],dp[i][j-1],dp[i-1][j],dp[i-1][j-1])
    dp[i][j] %= MOD
print(dp[N][M]+1) #1を足しているのは部分列()の分をカウントするため？ N,M = map(int, input().split()) N map(int, input().split()) map int input().split() ().split () input split M S = list(map(int, input().split())) S list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split T = list(map(int, input().split())) T list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split [0 for _ in range(M+1)] for _ in range(N+1) for _ in range(N+1) _ range(N+1) range N+1 N 1 for _ in range(N+1) [0 for _ in range(M+1)] dp = [[0 for _ in range(M+1)] for _ in range(N+1)] dp [[0 for _ in range(M+1)] for _ in range(N+1)] MOD = 10 ** 9 + 7 MOD 10 ** 9 + 7 10 ** 9 10 9 7 for i in range(1,N+1):
  for j in range(1,M+1):
    if S[i-1] == T[j-1]:
      # Sのi-1文字目、Tのj-1文字目が一致している場合は、
      # Sのi-2文字目、Tのj-2文字目までの部分列それぞれ
      # Sのi-1文字目、Tのj-1文字目を追加したものと、
      # Sのi-1文字目だけ、Tのj-1文字目だけの部分列パターンが
      # 増えるということだろうか。
      # つまり
      # dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1] + (dp[i-1][j-1] + 1)
      #            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      #            ここはS[i-1] != T[j-1]のときと同じ。
      # ということか？
      dp[i][j] = dp[i][j-1] + dp[i-1][j] + 1
    else:
      # dp[i-1][j-1]を引いているのは重複部分の排除？
      dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1]
    #print(i,j,dp[i][j],dp[i][j-1],dp[i-1][j],dp[i-1][j-1])
    dp[i][j] %= MOD i range(1,N+1) range 1 N+1 N 1 for j in range(1,M+1):
    if S[i-1] == T[j-1]:
      # Sのi-1文字目、Tのj-1文字目が一致している場合は、
      # Sのi-2文字目、Tのj-2文字目までの部分列それぞれ
      # Sのi-1文字目、Tのj-1文字目を追加したものと、
      # Sのi-1文字目だけ、Tのj-1文字目だけの部分列パターンが
      # 増えるということだろうか。
      # つまり
      # dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1] + (dp[i-1][j-1] + 1)
      #            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      #            ここはS[i-1] != T[j-1]のときと同じ。
      # ということか？
      dp[i][j] = dp[i][j-1] + dp[i-1][j] + 1
    else:
      # dp[i-1][j-1]を引いているのは重複部分の排除？
      dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1]
    #print(i,j,dp[i][j],dp[i][j-1],dp[i-1][j],dp[i-1][j-1])
    dp[i][j] %= MOD j range(1,M+1) range 1 M+1 M 1 if S[i-1] == T[j-1]:
      # Sのi-1文字目、Tのj-1文字目が一致している場合は、
      # Sのi-2文字目、Tのj-2文字目までの部分列それぞれ
      # Sのi-1文字目、Tのj-1文字目を追加したものと、
      # Sのi-1文字目だけ、Tのj-1文字目だけの部分列パターンが
      # 増えるということだろうか。
      # つまり
      # dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1] + (dp[i-1][j-1] + 1)
      #            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      #            ここはS[i-1] != T[j-1]のときと同じ。
      # ということか？
      dp[i][j] = dp[i][j-1] + dp[i-1][j] + 1
    else:
      # dp[i-1][j-1]を引いているのは重複部分の排除？
      dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1]
    #print(i,j,dp[i][j],dp[i][j-1],dp[i-1][j],dp[i-1][j-1])
     S[i-1] == T[j-1] S[i-1] S i-1 i 1 T[j-1] T j-1 j 1 dp[i][j] = dp[i][j-1] + dp[i-1][j] + 1 dp[i][j] [i] dp i j dp[i][j-1] + dp[i-1][j] + 1 dp[i][j-1] + dp[i-1][j] dp[i][j-1] [i] dp i j-1 j 1 dp[i-1][j] [i-1] dp i-1 i 1 j 1 dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1] dp[i][j] [i] dp i j dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1] dp[i][j-1] + dp[i-1][j] dp[i][j-1] [i] dp i j-1 j 1 dp[i-1][j] [i-1] dp i-1 i 1 j dp[i-1][j-1] [i-1] dp i-1 i 1 j-1 j 1 dp[i][j] %= MOD dp[i][j] [i] dp i j MOD print(dp[N][M]+1) print dp[N][M]+1 dp[N][M] [N] dp N M 1 T = list(map(int, input().split())) list(map(int, input().split())) T M = map(int, input().split()) map(int, input().split()) M dp = [[0 for _ in range(M+1)] for _ in range(N+1)] [[0 for _ in range(M+1)] for _ in range(N+1)] dp S = list(map(int, input().split())) list(map(int, input().split())) S MOD = 10 ** 9 + 7 10 ** 9 + 7 MOD N,M = map(int, input().split()) map(int, input().split()) N
N,M = map(int, input().split())
S = list(map(int, input().split()))
T = list(map(int, input().split()))

# dp[i][j] : Sのi-1文字目、Tのj-1文字目までの解(文字目は0-index)
dp = [[0 for _ in range(M+1)] for _ in range(N+1)]
#print(dp)
MOD = 10 ** 9 + 7

# なぜこれでよいのかわからない。。。
for i in range(1,N+1):
  for j in range(1,M+1):
    if S[i-1] == T[j-1]:
      # Sのi-1文字目、Tのj-1文字目が一致している場合は、
      # Sのi-2文字目、Tのj-2文字目までの部分列それぞれ
      # Sのi-1文字目、Tのj-1文字目を追加したものと、
      # Sのi-1文字目だけ、Tのj-1文字目だけの部分列パターンが
      # 増えるということだろうか。
      # つまり
      # dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1] + (dp[i-1][j-1] + 1)
      #            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      #            ここはS[i-1] != T[j-1]のときと同じ。
      # ということか？
      dp[i][j] = dp[i][j-1] + dp[i-1][j] + 1
    else:
      # dp[i-1][j-1]を引いているのは重複部分の排除？
      dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1]
    #print(i,j,dp[i][j],dp[i][j-1],dp[i-1][j],dp[i-1][j-1])
    dp[i][j] %= MOD
print(dp[N][M]+1) #1を足しているのは部分列()の分をカウントするため？
