#include <bits/stdc++.h>
using namespace std;
long long n, k, x[5], a[30], d = 0;
long long mod = 1000000007ll, fc[30];
long long C[30][30];
bool vis[30];
long long first(long long s1, long long s2, long long s3, long long ind,
                long long q, long long t) {
  if (t == 1) {
    if (s1 == 0) return (fc[q] * first(0, s2, s3, 0, 0, 2)) % mod;
    long long r = 0;
    for (int i = ind + 1; i <= n && a[i] <= s1; i++) {
      int N = 1;
      for (int j = i + 1; j <= n && a[j] == a[i]; j++) N++;
      for (int k = 1; k <= N && a[i] * k <= s1; k++) {
        vis[i + k - 1] = 1;
        r = (r + (C[N][k] * first(s1 - k * a[i], s2, s3, i + N - 1, q + k, 1)) %
                     mod) %
            mod;
      }
      for (int j = i; j < i + N; ++j) vis[j] = 0;
      i += N - 1;
    }
    return r;
  }
  if (t == 2) {
    if (s2 == 0) return (fc[q] * first(0, 0, s3, 0, 0, 3)) % mod;
    long long r = 0;
    for (int i = ind + 1; i <= n && a[i] <= s2; i++)
      if (!vis[i]) {
        vis[i] = 1;
        r = (r + first(0, s2 - a[i], s3, i, q + 1, 2)) % mod;
        vis[i] = 0;
      }
    return r;
  }
  q = 0;
  for (int i = 1; i <= n; i++)
    if (!vis[i]) q++;
  return fc[q];
}
int main() {
  memset(C, 0, sizeof(C));
  memset(vis, 0, sizeof(vis));
  for (int i = 0; i < 30; i++) C[i][0] = 1;
  for (int i = 1; i < 30; i++)
    for (int j = 1; j <= i; j++)
      C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
  cin >> n;
  fc[0] = 1;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    d += a[i];
    fc[i] = (fc[i - 1] * i) % mod;
  }
  sort(a + 1, a + n + 1);
  cin >> k;
  for (int i = 1; i <= k; i++) cin >> x[i];
  if (k == 0) {
    cout << fc[n];
    return 0;
  }
  if (k == 1) {
    fc[n] = (fc[n] - first(x[1], 0, d - x[1], 0, 0, 1) + mod) % mod;
    cout << fc[n];
    return 0;
  }
  if (x[1] > x[2]) swap(x[1], x[2]);
  long long r1 = first(min(x[1], d - x[1]), 0, max(d - x[1], x[1]), 0, 0, 1);
  memset(vis, 0, sizeof(vis));
  long long r2 = first(min(x[2], d - x[2]), 0, max(d - x[2], x[2]), 0, 0, 1);
  memset(vis, 0, sizeof(vis));
  x[3] = d - x[2];
  x[2] -= x[1];
  sort(x + 1, x + 3);
  long long r3 = first(x[1], x[2], x[3], 0, 0, 1);
  long long res = (fc[n] - r1 - r2 + r3 + 2 * mod) % mod;
  cout << res;
  return 0;
}
