func_code_string: #include <bits/stdc++.h>   using namespace std;   int rem = 1000000007;   vector<long long> v;   vector<long long> d(21);   vector<long long> down(21);   long long n, s;   long long binpow(long long a, long long n) {     if (n == 0) return 1;     long long tmp = binpow(a, n / 2);     if (n & 1) return tmp * tmp % rem * a % rem;     return tmp * tmp % rem;   }   long long one = 1;   long long getc(long long m, long long n) {     if (n < m) return 0;     long long ans = 1;     for (int i = 1; i <= m; ++i)       ans = (n - i + 1) % rem * ans % rem * down[i] % rem;     return ans;   }   void fn(long long indx, long long numnumbers, long long sum) {     if (sum > s) return;     if (indx == n) {       sum = s - sum;       d[numnumbers] += getc(n - one, sum + n - one);       return;     }     fn(indx + one, numnumbers, sum);     fn(indx + one, numnumbers + one, sum + v[indx] + one);   }   int main() {     cin >> n >> s;     for (int i = 1; i <= 20; i++) {       down[i] = binpow(i, rem - 2);     }     v.resize(n);     for (int i = 0; i < n; i++) {       scanf( %I64d , &v[i]);     }     long long rest = getc(n - one, n + s - one);     fn(0, 0, 0);     for (int i = 1; i <= n; i++) {       if (i & 1)         rest -= d[i];       else         rest += d[i];       rest += rem;       rest %= rem;     }     cout << rest;     return 0;   }   