- 多重集的组合数问题。注意C(0,0)应该是1
- __builtin_ffs和__builtin_ctz的功能是类似的
#include <bits/stdc++.h>
using namespace std;
#define int long long
const signed mod=1000000007;
int power(int n,int p)
{if(p==0){return 1;}long long tmp=power(n,p/2);if(p%2==1){return tmp*tmp%mod*n%mod;}return tmp*tmp%mod;
}
int f[25],sum[1<<20],inv[25];
int lowbit(int n)
{return n&(-n);
}
int c(int n,int m)
{if(n<0||m<0){return 0;}if(m>n){return 0;}if(n==0&&m==0){return 1;}n%=mod;int res=inv[m];while(m--){res=res*n%mod;n--;}return res;
}
signed main()
{ios::sync_with_stdio(false);cin.tie(0);int n,s;cin>>n>>s;inv[0]=1;for(int i=1;i<=n;i++){inv[i]=inv[i-1]*power(i,1000000005)%mod;}for(int i=1;i<=n;i++){cin>>f[i];}int ans=0;for(int i=0;i<(1<<n);i++){if(i>0){sum[i]=sum[i-lowbit(i)]+f[__builtin_ffs(i)]+1;}int opt=__builtin_parity(i);opt==0? opt=1:opt=-1;ans=(ans+opt*c(n+s-1-sum[i],n-1))%mod;}cout<<(ans+mod)%mod<<endl;return 0;
}