#include <bits/stdc++.h>
using namespace std;
template <class T>
struct rge {
  T b, e;
};
template <class T>
rge<T> range(T i, T j) {
  return rge<T>{i, j};
}
struct debug {
  template <class T>
  debug& operator<<(const T&) {
    return *this;
  }
};
using ll = long long;
template <typename T>
void min_self(T& a, T b) {
  a = min(a, b);
}
template <typename T>
void max_self(T& a, T b) {
  a = max(a, b);
}
const int mod = 998244353;
inline int add(int a, int b) {
  a += b;
  while (a >= mod) a -= mod;
  while (a < 0) a += mod;
  return a;
}
inline void add_self(int& a, int b) { a = add(a, b); }
inline int mul(int a, int b) { return 1LL * a * b % mod; }
inline void mul_self(int& a, int b) { a = mul(a, b); }
inline int mpow(int a, int n) {
  int res = 1;
  while (n > 0) {
    if (n & 1) {
      res = mul(res, a);
    }
    a = mul(a, a);
    n >>= 1;
  }
  return res;
}
inline int divide(int a, int b) {
  assert(b != 0);
  return mul(a, mpow(b, mod - 2));
}
const int mxN = 200 * 1000 + 5;
int fact[mxN], finv[mxN];
inline int binomial(int n, int k) {
  return mul(fact[n], mul(finv[n - k], finv[k]));
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  vector<int> a(n), b(m);
  for (int i = 0; i < int(n); i++) cin >> a[i];
  for (int i = 0; i < int(m); i++) cin >> b[i];
  if (m > n) {
    cout << 0 << '\n';
    return 0;
  }
  int p = m - 1;
  vector<int> pos;
  for (int i = n - 1; i >= 0 && p >= 0; i--) {
    if (a[i] == b[p]) {
      pos.push_back(i);
      --p;
    }
  }
  if (p >= 0) {
    cout << "0\n";
    return 0;
  }
  reverse(pos.begin(), pos.end());
  debug() << "[ "
          << "pos"
             ": "
          << (pos) << " ] ";
  int ans = 1;
  vector<int> tree(2 * n);
  for (int i = 0; i < int(n); i++) tree[i + n] = a[i];
  for (int i = n - 1; i > 0; --i) {
    tree[i] = min(tree[2 * i], tree[2 * i + 1]);
  }
  const int inf = 1e9 + 5;
  auto Get = [&](int i, int j) {
    int ret = inf;
    for (i += n, j += n; i <= j; i /= 2, j /= 2) {
      if (i % 2 == 1) min_self(ret, tree[i++]);
      if (j % 2 == 0) min_self(ret, tree[j--]);
    }
    return ret;
  };
  if (Get(0, pos[0]) < b[0] || Get(pos.back(), n - 1) < b[m - 1]) {
    cout << 0 << '\n';
    return 0;
  }
  for (int i = 0; i < (int)pos.size() - 1; i++) {
    int l = pos[i], r = pos[i + 1];
    int lo = pos[i], hi = r;
    int L = -1, R = -1;
    while (lo <= hi) {
      int mid = lo + (hi - lo) / 2;
      if (Get(l, mid) == a[l]) {
        R = mid;
        lo = mid + 1;
      } else {
        hi = mid - 1;
      }
    }
    lo = l, hi = r;
    while (lo <= hi) {
      int mid = lo + (hi - lo) / 2;
      if (Get(mid, r) == a[r]) {
        hi = mid - 1;
        L = mid;
      } else {
        lo = mid + 1;
      }
    }
    debug() << "[ "
            << "i"
               ": "
            << (i) << " ] "
            << "[ "
            << "L"
               ": "
            << (L) << " ] "
            << "[ "
            << "R"
               ": "
            << (R) << " ] ";
    int len = max(0, R - L + 1);
    mul_self(ans, len);
  }
  cout << ans << '\n';
}
