func_code_string: #include <bits/stdc++.h>   using namespace std;   long long n, k, x[5], a[30], d = 0;   long long mod = 1000000007ll, fc[30];   long long C[30][30];   bool vis[30];   long long first(long long s1, long long s2, long long s3, long long ind,                   long long q, long long t) {     if (t == 1) {       if (s1 == 0) return (fc[q] * first(0, s2, s3, 0, 0, 2)) % mod;       long long r = 0;       for (int i = ind + 1; i <= n && a[i] <= s1; i++) {         int N = 1;         for (int j = i + 1; j <= n && a[j] == a[i]; j++) N++;         for (int k = 1; k <= N && a[i] * k <= s1; k++) {           vis[i + k - 1] = 1;           r = (r + (C[N][k] * first(s1 - k * a[i], s2, s3, i + N - 1, q + k, 1)) %                        mod) %               mod;         }         for (int j = i; j < i + N; ++j) vis[j] = 0;         i += N - 1;       }       return r;     }     if (t == 2) {       if (s2 == 0) return (fc[q] * first(0, 0, s3, 0, 0, 3)) % mod;       long long r = 0;       for (int i = ind + 1; i <= n && a[i] <= s2; i++)         if (!vis[i]) {           vis[i] = 1;           r = (r + first(0, s2 - a[i], s3, i, q + 1, 2)) % mod;           vis[i] = 0;         }       return r;     }     q = 0;     for (int i = 1; i <= n; i++)       if (!vis[i]) q++;     return fc[q];   }   int main() {     memset(C, 0, sizeof(C));     memset(vis, 0, sizeof(vis));     for (int i = 0; i < 30; i++) C[i][0] = 1;     for (int i = 1; i < 30; i++)       for (int j = 1; j <= i; j++)         C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;     cin >> n;     fc[0] = 1;     for (int i = 1; i <= n; ++i) {       cin >> a[i];       d += a[i];       fc[i] = (fc[i - 1] * i) % mod;     }     sort(a + 1, a + n + 1);     cin >> k;     for (int i = 1; i <= k; i++) cin >> x[i];     if (k == 0) {       cout << fc[n];       return 0;     }     if (k == 1) {       fc[n] = (fc[n] - first(x[1], 0, d - x[1], 0, 0, 1) + mod) % mod;       cout << fc[n];       return 0;     }     if (x[1] > x[2]) swap(x[1], x[2]);     long long r1 = first(min(x[1], d - x[1]), 0, max(d - x[1], x[1]), 0, 0, 1);     memset(vis, 0, sizeof(vis));     long long r2 = first(min(x[2], d - x[2]), 0, max(d - x[2], x[2]), 0, 0, 1);     memset(vis, 0, sizeof(vis));     x[3] = d - x[2];     x[2] -= x[1];     sort(x + 1, x + 3);     long long r3 = first(x[1], x[2], x[3], 0, 0, 1);     long long res = (fc[n] - r1 - r2 + r3 + 2 * mod) % mod;     cout << res;     return 0;   }   