#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
void in() {}
template <typename T, class... U>
void in(T &t, U &...u) {
  cin >> t;
  in(u...);
}
void out() { cout << "\n"; }
template <typename T, class... U>
void out(const T &t, const U &...u) {
  cout << t;
  if (sizeof...(u)) cout << " ";
  out(u...);
}
long long mo = 1e9 + 7;
void solve() {
  long long n;
  in(n);
  long long n1;
  in(n1);
  vector<long long> morty(n);
  vector<long long> morty1(n1);
  for (long long i = 0; i < n; i++) in(morty[i]);
  for (long long i = 0; i < n1; i++) in(morty1[i]);
  map<vector<long long>, long long> map1;
  map<vector<long long>, long long> map2;
  vector<long long> tmp;
  for (long long i = 0; i < 1 << n; i++) {
    for (long long i1 = 0; i1 < n; i1++) {
      if (i & (1 << i1)) tmp.push_back(morty[i1]);
    }
    map1[tmp]++;
    tmp.clear();
  }
  for (long long i = 0; i < 1 << n1; i++) {
    vector<long long> tmp;
    for (long long i1 = 0; i1 < n1; i1++) {
      if (i & (1 << i1)) tmp.push_back(morty1[i1]);
    }
    map2[tmp]++;
    tmp.clear();
  }
  long long rick = 0;
  for (auto &x : map1) {
    rick += (x.second * map2[x.first]) % mo;
    rick %= mo;
  }
  out(rick);
}
int32_t main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin.tie(0);
  solve();
  return 0;
}
