- 多重集的组合数问题。注意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;
}