//URL:https://www.luogu.com.cn/problem/P4799
/*
1-4:dfs n<=20 m<=1e18 O(2^20) ÍêÈ«¿ÉÒÔ½ÓÊÜ
5-7:dp n=40 m=1e6 O(n*m)
8-10: dp+meet in middle O(2^20+1)
upper_bound > 0-end-1 return 0-end
lower_bound >= 0-end-1 return 0-end
*/
/*
5 1000
100 1500 500 500 1000
8
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
//#include<queue>
//#include<vector>
//#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=1e1 +10;
const int mod=998244353;
const int inf=0x3f3f3f3f;
ll n,m,suma[1<<21],sumb[1<<21],cnta,cntb,a[100],ans;
void dfs(ll l,ll r,ll summ[],ll &cnt,ll sum)
{
if(sum>m) return;
if(l>r)
{
summ[++cnt]=sum;
return;
}
dfs(l+1,r,summ,cnt,sum+a[l]);
dfs(l+1,r,summ,cnt,sum);
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
dfs(1,n>>1,suma,cnta,0);
dfs((n>>1)+1,n,sumb,cntb,0);//(n>>1)+1
sort(suma+1,suma+1+cnta);
for(int i=1;i<=cntb;i++)
ans+=upper_bound(suma+1,suma+1+cnta,m-sumb[i])-suma-1;
cout<<ans<<'\n';
return 0;
}