#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
if (!(cin >> n >> m)) return 0;
vector<int> a(n+1), b(m+1);
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int j = 1; j <= m; ++j) cin >> b[j];
// lcs[i][j]: độ dài LCS của a[1..i] và b[1..j] mà kết thúc tại b_j (theo ảnh)
// f[i][j]: số dãy khác nhau có độ dài lcs[i][j] kết thúc tại b_j
vector<vector<int>> lcs(n+1, vector<int>(m+1, 0));
vector<vector<ll>> f(n+1, vector<ll>(m+1, 0));
// định nghĩa bổ trợ: "vị trí 0" (không có phần tử) với lcs = 0 và có 1 dãy rỗng
for (int i = 0; i <= n; ++i) f[i][0] = 1; // f[i][0] = 1 (dãy rỗng)
for (int j = 0; j <= m; ++j) lcs[0][j] = 0, f[0][j] = 1;
// xử lý O(n^3)
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (a[i] == b[j]) {
// tìm lcs[i][j] = 1 + max_{0 <= t < j} lcs[i-1][t]
int bestLen = 0;
for (int t = 0; t < j; ++t) {
bestLen = max(bestLen, lcs[i-1][t]);
}
lcs[i][j] = bestLen + 1;
// tính f[i][j] = sum f[i-1][t] với các t thỏa:
// (1) lcs[i-1][t] + 1 == lcs[i][j]
// (2) không tồn tại h in (t+1..j-1) sao cho b[h] == b[t]
ll ways = 0;
for (int t = 0; t < j; ++t) {
if (lcs[i-1][t] + 1 != lcs[i][j]) continue;
bool ok = true;
// kiểm tra có phần tử bằng b[t] giữa t+1..j-1 hay không
if (t != 0) { // nếu t==0 thì b[0] là "không có", luôn ok
for (int h = t+1; h <= j-1; ++h) {
if (b[h] == b[t]) { ok = false; break; }
}
}
if (ok) ways += f[i-1][t];
}
f[i][j] = ways;
} else {
// không dùng a[i], giữ giá trị từ i-1
lcs[i][j] = lcs[i-1][j];
f[i][j] = f[i-1][j];
}
}
}
// tìm độ dài LCS lớn nhất (toàn chuỗi a[1..n], b[1..m]) và tổng số dãy KHÁC NHAU.
int L = 0;
for (int j = 1; j <= m; ++j) L = max(L, lcs[n][j]);
// tổng các f[n][j] với lcs[n][j] == L, nhưng tránh đếm trùng do cùng giá trị b_j
ll ans = 0;
for (int j = 1; j <= m; ++j) {
if (lcs[n][j] != L) continue;
// nếu tồn tại k > j với b[k] == b[j] và lcs[n][k] == L thì bỏ qua j
bool hasLaterSame = false;
for (int k = j+1; k <= m; ++k) {
if (b[k] == b[j] && lcs[n][k] == L) { hasLaterSame = true; break; }
}
if (!hasLaterSame) ans += f[n][j];
}
// nếu L == 0 thì chỉ có dãy rỗng: tùy yêu cầu bạn có thể in 0 và 1 (độ dài 0, 1 cách)
cout << L << " " << ans << "\n";
return 0;
}