#include <iostream>
#include <queue>
#include <cmath>
#include <cstring>
#include <array>
#include <sstream>
#include <vector>
int main() {
    const int mod=1e9+7;
    std::stringstream cin(R"(24
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2
10 15)");
    int n;
    std::cin>>n;
    std::vector<int> dis((1<<n),0);
    for (int i = 0; i < n; ++i) {
        std::cin>>dis[1<<i];
    }
    int m;
    std::cin>>m;
    int a1=0,a2=0;
    if (m>0){
        std::cin>>a1;
    }
    if (m>1){
        std::cin>>a2;
    }
    if (a1>a2){
        std::swap(a1,a2);
    }
    std::vector<int> dp((1<<n),0);
    dp[0]=1;
    for (int i = 1; i < (1 << n); ++i) {
        int t=i&-i;//lowbit
        dis[i]=dis[i^t]+dis[t];//i中除了t的其他二进制位 i^t
        if (dis[i]==a1||dis[i]==a2){
            continue;
        }
        for (int j = i,k;j;j^=k) {
            k=j&-j;
            (dp[i]+=dp[i^k])>=mod&&(dp[i]-=mod);//replace % with -
        }
    }
    std::cout<<dp[(1<<n)-1]<<'\n';
    return 0;
}
/*#ifndef WIN32
#ifndef __GNUC__
#define __PACKED__
#pragma options align=packed
#else
#define __PACKED__ __attribute__ ((packed))
#pragma pack(push,1)
#endif
#else
#define __PACKED__
#pragma pack(push,1)
#endif*/
//#pragma pack(1)