#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:16777216")
using namespace std;
const double eps = 1e-9;
const double pi = acos(-1.0);
const int mod = (int)1e9 + 7;
int n, f[25], pw[13];
vector<int> a, b;
int get(int value) {
  int res = 0;
  map<int, int> dp1[25], dp2[25];
  for (int mask = 0; mask < (1 << (n / 2)); mask++) {
    int sum = 0;
    int cnt = 0;
    for (int i = 0; i < n / 2; i++) {
      if (mask & (1 << i)) {
        sum += a[i];
        cnt++;
      }
    }
    dp1[cnt][sum]++;
  }
  for (int mask = 0; mask < (1 << ((n + 1) / 2)); mask++) {
    int sum = 0;
    int cnt = 0;
    for (int i = 0; i < (n + 1) / 2; i++) {
      if (mask & (1 << i)) {
        sum += a[n / 2 + i];
        cnt++;
      }
    }
    dp2[cnt][sum]++;
  }
  for (int i = 0; i <= n / 2; i++) {
    for (__typeof(dp1[i].begin()) it1 = dp1[i].begin(); it1 != dp1[i].end();
         ++it1) {
      if (it1->first > value) continue;
      for (int j = 0; j <= (n + 1) / 2; j++) {
        if (dp2[j].count(value - it1->first)) {
          res += f[i + j] * (long long)f[n - i - j] % mod *
                 (long long)it1->second % mod *
                 (long long)dp2[j][value - it1->first] % mod;
          res %= mod;
        }
      }
    }
  }
  return res;
}
int main() {
  pw[0] = 1;
  for (int i = 1; i <= 12; i++) {
    pw[i] = pw[i - 1] * 3;
  }
  f[0] = 1;
  for (int i = 1; i <= 24; i++) {
    f[i] = f[i - 1] * (long long)i % mod;
  }
  cin >> n;
  a.resize(n);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  int k;
  cin >> k;
  b.resize(k);
  for (int i = 0; i < k; i++) {
    cin >> b[i];
  }
  if (k == 0) {
    cout << f[n] << endl;
  } else if (k == 1) {
    cout << (f[n] - get(b[0]) + mod) % mod << endl;
  } else {
    if (b[0] > b[1]) swap(b[0], b[1]);
    int res = f[n];
    res = (res - get(b[0]) + mod) % mod;
    res = (res - get(b[1]) + mod) % mod;
    map<int, map<int, int> > dp1[25][25], dp2[25][25];
    for (int mask = 0; mask < pw[n / 2]; mask++) {
      int sum1 = 0;
      int cnt1 = 0;
      int sum2 = 0;
      int cnt2 = 0;
      for (int i = 0; i < n / 2; i++) {
        int v = mask / pw[i] % 3;
        if (v == 0) {
          cnt1++;
          sum1 += a[i];
        } else if (v == 1) {
          cnt2++;
          sum2 += a[i];
        }
      }
      dp1[cnt1][cnt2][sum1][sum2]++;
    }
    for (int mask = 0; mask < pw[(n + 1) / 2]; mask++) {
      int sum1 = 0;
      int cnt1 = 0;
      int sum2 = 0;
      int cnt2 = 0;
      for (int i = 0; i < (n + 1) / 2; i++) {
        int v = mask / pw[i] % 3;
        if (v == 0) {
          sum1 += a[i + n / 2];
          cnt1++;
        } else if (v == 1) {
          sum2 += a[i + n / 2];
          cnt2++;
        }
      }
      dp2[cnt1][cnt2][sum1][sum2]++;
    }
    long long add = 0;
    for (int i = 0; i <= n / 2; i++) {
      for (int j = 0; j <= n / 2 - i; j++) {
        for (__typeof(dp1[i][j].begin()) it1 = dp1[i][j].begin();
             it1 != dp1[i][j].end(); ++it1) {
          for (__typeof(it1->second.begin()) it2 = it1->second.begin();
               it2 != it1->second.end(); ++it2) {
            if (it1->first > b[0] || it2->first > b[1] - b[0]) continue;
            for (int u = 0; u <= (n + 1) / 2; u++) {
              for (int v = 0; v <= (n + 1) / 2 - u; v++) {
                if (dp2[u][v].count(b[0] - it1->first) &&
                    dp2[u][v][b[0] - it1->first].count(b[1] - b[0] -
                                                       it2->first)) {
                  add += f[u + i] * (long long)f[v + j] % mod *
                         (long long)f[n - u - i - v - j] % mod *
                         (long long)it2->second % mod *
                         (long long)dp2[u][v][b[0] - it1->first]
                                       [b[1] - b[0] - it2->first];
                }
              }
            }
          }
        }
      }
    }
    cout << (res + add) % mod << endl;
  }
  return 0;
}
