func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long mod = 1e9 + 7;   long long m, n, f[22], inv[22];   inline long long read() {     long long s = 0, f = 1;     char c = getchar();     while (c <  0  || c >  9 ) {       if (c ==  - ) {         f = -1;       }       c = getchar();     }     while (c >=  0  && c <=  9 ) {       s = (s << 1) + (s << 3) + c -  0 ;       c = getchar();     }     return s * f;   }   inline void write(long long x) {     if (x < 0) {       x = ~(x - 1);       putchar( - );     }     if (x > 9) {       write(x / 10);     }     putchar(x % 10 +  0 );   }   long long power(long long a, long long p) {     long long res = 1;     while (p) {       if (p & 1) res *= a, res %= mod;       p >>= 1;       a *= a;       a %= mod;     }     return res;   }   long long c(long long n, long long m) {     if (n < m || n < 0 || m < 0) {       return 0;     }     n %= mod;     if (n == 0 || m == 0) {       return 1;     }     long long res = 1;     for (long long i = 0; i < m; i++) {       res *= n - i, res %= mod;     }     for (long long i = 1; i <= m; i++) {       res *= inv[i], res %= mod;     }     return res;   }   signed main() {     n = read(), m = read();     for (long long i = 1; i <= n; i++) {       f[i] = read();     }     for (long long i = 1; i <= 20; i++) {       inv[i] = power(i, mod - 2);     }     long long ans = 0;     for (long long i = 1; i < (1 << n); i++) {       long long t = n + m - 1, bit = 0;       for (long long j = 0; j < n; j++) {         if (i & (1 << j)) {           t -= f[j + 1] + 1;           bit++;         }       }       if (bit % 2 == 1) {         ans = (ans + c(t, n - 1)) % mod;       } else {         ans = (ans - c(t, n - 1)) % mod;       }     }     cout << (c(n + m - 1, n - 1) - ans + mod) % mod << endl;     return 0;   }   