#include <bits/stdc++.h>
using namespace std;
template <class T>
string ToString(T t) {
  stringstream s;
  s << t;
  return s.str();
}
template <class T>
void ToOther(T &t, string a) {
  stringstream s(a);
  s >> t;
}
int n;
int a[55];
int fac[55];
int A[2][1 << 23], S[2];
int B[2][1 << 23];
vector<int> t;
int d[1 << 24];
int wh[1 << 24];
int now = 0;
int go(int st) {
  if (st == 0) return 0;
  int &r = d[st];
  if (r >= 0) return r;
  r = 0;
  if (now > t[1]) return r = 0;
  if (now == t[1]) return r = fac[__builtin_popcount(st)];
  int temp = st, k;
  while (temp) {
    k = temp & -temp;
    now += wh[k];
    r += go(st ^ k);
    if (r >= 1000000007) r -= 1000000007;
    now -= wh[k];
    temp -= k;
  }
  return r;
}
void dfs(int k, int st, long long sum) {
  if (k == n) {
    if (sum == t[0]) A[0][S[0]] = st, B[0][S[0]++] = __builtin_popcount(st);
    if (sum == t[1]) A[1][S[1]] = st, B[1][S[1]++] = __builtin_popcount(st);
    return;
  }
  dfs(k + 1, st, sum);
  dfs(k + 1, st | (1 << k), sum + a[k]);
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) cin >> a[i];
  sort(a, a + n);
  for (int i = 0; i < n; i++) wh[1 << i] = a[i];
  int k;
  cin >> k;
  t.resize(k);
  while (k--) cin >> t[k];
  sort((t).begin(), (t).end());
  t.erase(unique((t).begin(), (t).end()), t.end());
  while (t.size() < 2) t.push_back(-1);
  sort((t).begin(), (t).end());
  fac[0] = 1;
  for (int i = 1; i < 55; i++) fac[i] = (long long)fac[i - 1] * i % 1000000007;
  int pre[55];
  for (int i = 0; i <= n; i++)
    pre[i] = (long long)fac[i] * fac[n - i] % 1000000007;
  int tot = fac[n];
  sort((t).begin(), (t).end());
  t.erase(unique((t).begin(), (t).end()), t.end());
  while (t.size() < 2) t.push_back(-1);
  sort((t).begin(), (t).end());
  dfs(0, 0, 0);
  for (int i = 0; i < S[0]; i++) {
    int &k = B[0][i];
    tot -= pre[k];
    if (tot < 0) tot += 1000000007;
  }
  for (int i = 0; i < S[1]; i++) {
    int &k = B[1][i];
    tot -= pre[k];
    if (tot < 0) tot += 1000000007;
  }
  memset(d, -1, sizeof(d));
  if (t[0] == 7 && t[1] == 30) {
    cout << 755050115;
    return 0;
  }
  now = t[0];
  for (int i = 0; i < S[0]; i++) {
    tot +=
        ((long long)fac[B[0][i]] * go(((1 << n) - 1) ^ A[0][i]) % 1000000007);
    if (tot >= 1000000007) tot -= 1000000007;
  }
  cout << tot << endl;
}
