#include <math.h>
#include <algorithm>
#include <string.h>
#include <cstdio>
using namespace std;
#define int long long
int n;
long long m;
int a[40];
int f[1<<21],b[1<<21];
int ans=0;
int flag1,flag2;
int cnt1,cnt2;
void dfs1(int s,int e,long long cost){
if(s==e){
f[++cnt1]=cost;
if(a[s]+cost<=m) f[++cnt1]=a[s]+cost;
return;
}
if(a[s]+cost<=m) dfs1(s+1,e,cost+a[s]);
dfs1(s+1,e,cost);
return;
}
void dfs2(int s,int e,long long cost){
if(s==e){
b[++cnt2]=cost;
if(a[s]+cost<=m) b[++cnt2]=a[s]+cost;
return;
}
if(a[s]+cost<=m) dfs2(s+1,e,cost+a[s]);
dfs2(s+1,e,cost);
return;
}
int countans(){
long long ans=0;
for(int i=1;i<=cnt1;i++){
int k=upper_bound(b+1,b+cnt2+1,m-f[i])-b-1;
if(k>cnt2) continue;
ans+=k;
}
return ans;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
dfs1(1,n/2,0);
sort(f+1,f+cnt1+1);
dfs2(n/2+1,n,0);
sort(b+1,b+cnt2+1);
cout<<countans()<<endl;
return 0;
}