题解:http://codeforces.com/blog/entry/13181
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 55
#define ll long long
#define inf 0x3f3f3f3f
ll mod=1e9+7;
ll f[22];
ll n,s;
ll inv(ll a)//求逆元
{
return a == 1 ? 1 : (long long)(mod - mod / a) * inv(mod % a) % mod;
}
ll choose(ll m,ll k)求组合数C(m,k)
{
ll ret=1;
for(ll i=0;i<k;i++)
ret=ret*((m-i)%mod)%mod*inv(i+1)%mod;
return ret;
}
ll go(ll i,ll s)//求解系数
{
if(s<0) return 0;
if(i==n)
return choose(n+s-1,n-1);
return (go(i+1,s)-go(i+1,s-f[i])+mod)%mod;
}
int main()
{
cin>>n>>s;
for(int i=0;i<n;i++)
{
cin>>f[i];
f[i]++;
}
cout<<(go(0,s)+mod)%mod<<endl;
//system("pause");
}