func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MOD = 1e9 + 7;   int n, k;   int A[25], B[2];   int fact[25];   int mod(long long int a) { return (a % MOD + MOD) % MOD; }   int poww(int pw) {     if (pw == 0) return 1;     return 3 * poww(pw - 1);   }   int result = 0;   int precompute(int U1) {     int ret = 0;     int el = (n + 1) / 2, fl = n - el;     int EL = (1 << el), FL = (1 << fl);     map<pair<int, int>, int> store;     int cnt, sum;     for (int i = 0; i < FL; i++) {       sum = cnt = 0;       for (int bit = 0; bit < fl; bit++) {         if (i & (1 << bit)) sum += A[el + bit], cnt++;         if (sum > MOD) sum = MOD;       }       if (sum != MOD) store[pair<int, int>(sum, cnt)]++;     }     for (int i = 0; i < EL; i++) {       sum = cnt = 0;       for (int bit = 0; bit < el; bit++) {         if (i & (1 << bit)) sum += A[bit], cnt++;         if (sum > MOD) sum = MOD;       }       if (sum > U1) continue;       for (int x = 0; x < fl + 1; x++) {         pair<int, int> t = pair<int, int>(U1 - sum, x);         if (store.count(t)) {           int ff = mod((long long int)store[t] * fact[x + cnt]);           ff = mod((long long int)ff * fact[n - x - cnt]);           ret = mod(ret + ff);         }       }     }     result = mod(result - ret);     return result;   }   int pc2(int U1, int U2) {     int el = (n - 1) / 2, fl = n - el;     int EL = poww(el), FL = poww(fl);     precompute(U1);     precompute(U2);     if (U1 > U2) swap(U1, U2);     U2 = U2 - U1;     map<pair<pair<int, int>, int>, int> store;     int sum1, sum2, ret = 0;     int c1, c2;     for (int i = 0; i < FL; i++) {       sum1 = sum2 = c1 = c2 = 0;       int t = i;       for (int bit = 0; bit < fl; bit++) {         if (t % 3 == 1) sum1 += A[el + bit], c1++;         if (t % 3 == 2) sum2 += A[el + bit], c2++;         t /= 3;         if (sum1 > MOD) sum1 = MOD;         if (sum2 > MOD) sum2 = MOD;       }       if (sum1 != MOD && sum2 != MOD)         store[pair<pair<int, int>, int>(pair<int, int>(sum1, sum2),                                         (c1 << 8) | c2)]++;     }     for (int i = 0; i < EL; i++) {       sum1 = sum2 = c1 = c2 = 0;       int t = i;       for (int bit = 0; bit < el; bit++) {         if (t % 3 == 1) sum1 += A[bit], c1++;         if (t % 3 == 2) sum2 += A[bit], c2++;         if (sum1 > MOD) sum1 = MOD;         if (sum2 > MOD) sum2 = MOD;         t /= 3;       }       if (sum1 > U1 || sum2 > U2) continue;       for (int x = 0; x < fl + 1; x++) {         for (int y = 0; y + x <= fl; y++) {           if (x + y > fl) continue;           pair<pair<int, int>, int> t = pair<pair<int, int>, int>(               pair<int, int>(U1 - sum1, U2 - sum2), (x << 8) | y);           if (store.count(t)) {             int ff = store[t];             ff = mod((long long int)ff * fact[c1 + x]);             ff = mod((long long int)ff * fact[c2 + y]);             ff = mod((long long int)ff * fact[n - c1 - x - c2 - y]);             ret = mod((long long int)ret + ff);           }         }       }     }     result = mod((long long int)result + ret);     return ret;   }   int main() {     B[0] = B[1] = -1;     fact[0] = 1;     for (int i = 1; i < 25; i++) fact[i] = ((long long int)fact[i - 1] * i) % MOD;     cin >> n;     for (int i = 0; i < n; i++) {       cin >> A[i];     }     cin >> k;     for (int i = 0; i < k; i++) cin >> B[i];     result = fact[n];     if (k == 1)       precompute(B[0]);     else if (k == 2) {       pc2(B[0], B[1]);     }     cout << result << endl;     return 0;   }   