/*
n<=24张卡牌ai 随意选择顺序 若过程中值==厄运数字 失败 否则成功 问成功的方案数
dfs->RE 考虑状压dp
f[i]:i状态下成功的方案数
f[i]=sum(f[i^(1<<j-1)]) (i&(1<<j-1)==1) f[0]=1(f[1]=f[0]+0)
dis[i]=dis[i^(1<<j-1)]+dis[1<<j-1]
8bit=1byte
2*1<<26==2*1e6*64==1e8
222MB=222*1024KB=222*1024^2 Byte==222*1e6*8 bit==2e9 bit
int 数组 4byte==32bit ->3e9
ll 数组 8byte==64bit ->6e9
*/
/*
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<queue>
#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=1e1 +10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
int n,m;
int dis[1<<26],f[1<<26],b1,b2;
void add(int &a,int b){ for(a+=b;a>=mod;a-=mod); }
void solve(int x){
for(int i=x,j;i;i^=j){ j=i&-i; add(f[x],f[x^j]) ;}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>dis[1<<(i-1)];
cin>>m;
if(m==1) cin>>b1;
else if(m==2) cin>>b1>>b2;
f[0]=1;
for(int i=1;i<(1<<n);i++)
{
int j=i&-i;
dis[i]=dis[i^j]+dis[j];
if(dis[i]==b1||dis[i]==b2) continue;
solve(i);
}
cout<<f[(1<<n)-1]<<'\n';
return 0;
}