#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//using namespace __gnu_pbds;
using namespace std;
#define intt int
#define int long long int
//#define ordered_set tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>
#define io cin.tie(nullptr); cout.tie(nullptr); ios_base::sync_with_stdio(false);
#define all(v) v.begin(), v.end()
#define endl '\n'
#define ff first
#define ss second
#define i128 __int128_t
#define ld long double
#define pb push_back
//#define printv(v,a,b) cerr<<#v<<' ';for(int i=a;i<b;++i){cerr<<v[i]<<' ';} cerr<<endl;
#define debug(v) cout<<#v<<' ';for(int i=0;i<v.size();++i){cout<<v[i]<<' ';} cout<<endl;
#define rsz resize
#define skip continue
#define unmap unordered_map
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<bool> vb;
const int MAX=2e5+5;
const int mod=1e9+7;
const long long INF=1e18+7;
void init();
void solve(){
int n,m;
cin>>n>>m;
vi v(n);
for(int i=0;i<n;++i){
cin>>v[i];
}
int n1=(n+1)/2,n2=n/2;
vi left,right;
for(int mask=0;mask<(1<<n1);++mask){
int sum=0;
for(int i=0;i<n1;++i){
if(mask&(1<<i)){
sum+=v[i];
}
}
left.pb(sum);
}
for(int mask=0;mask<(1<<n2);++mask){
int sum=0;
for(int i=0;i<n2;++i){
if(mask&(1<<i)){
sum+=v[i+n1];
}
}
right.pb(sum);
}
sort(all(right));
int ans=0;
for(int i=0;i<left.size();++i){
int temp=m-left[i];
auto it=upper_bound(all(right),temp);
ans+=(it-right.begin());
}
cout<<ans<<endl;
}
signed main(){
io;
int t=1,n;
init();
// cin>>t;
#ifdef LOCAL
freopen("output.txt","w",stdout);
#endif
while(t--){
solve();
}
}
void init(){
}