//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;
}