#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)
评论区