#include <bits/stdc++.h>
using namespace std;
#define Long long long
#define bint __int128
#define _3bkarm cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
struct custom_hash {
static uint64_t splitmix64(uint64_t x) {
x = x + 0x9e3779b97f4a7c15;
x = ( x ^ (x >> 30) ) * 0xbf58476d1ce4e5b9;
x = ( x ^ (x >> 27) ) * 0x94d049bb133111eb;
return x ^ (x >> 31);
}
size_t operator()(uint64_t x) const {
static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
return splitmix64(x + FIXED_RANDOM);
}
};
template <class K, class V> using HT = gp_hash_table<K, V, custom_hash>;
void get_shit_done() {
int n, x;
cin >> n >> x;
vector<int> t(n);
for (int i = 0; i < n; ++i) {
cin >> t[i];
}
int l = n / 2, r = (n + 1) / 2;
HT<Long, int> freqLeft;
for (int mask = 0; mask < (1 << l); ++mask) {
Long sum = 0;
bitset<50> bt(mask);
for (int i = 0; i < l; ++i) {
if (bt[i]) {
sum += t[i];
}
}
++freqLeft[sum];
}
Long ans = 0;
for (int mask = 0; mask < (1 << r); ++mask) {
Long sum = 0;
bitset<50> bt(mask);
for (int i = l; i < n; ++i) {
if (bt[i - l]) {
sum += t[i];
}
}
ans += freqLeft[x - sum];
}
cout << ans;
}
signed main() {
_3bkarm
int ts = 1;
// cin >> ts;
while (ts--) {
get_shit_done();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAojZGVmaW5lIExvbmcgbG9uZyBsb25nCiNkZWZpbmUgYmludCBfX2ludDEyOAojZGVmaW5lIF8zYmthcm0gY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCk7IGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKIAojaW5jbHVkZSA8ZXh0L3BiX2RzL2Fzc29jX2NvbnRhaW5lci5ocHA+CiAKdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiAKc3RydWN0IGN1c3RvbV9oYXNoIHsKICAgIHN0YXRpYyB1aW50NjRfdCBzcGxpdG1peDY0KHVpbnQ2NF90IHgpIHsKICAgICAgICB4ID0geCArIDB4OWUzNzc5Yjk3ZjRhN2MxNTsKICAgICAgICB4ID0gKCB4IF4gKHggPj4gMzApICkgKiAweGJmNTg0NzZkMWNlNGU1Yjk7CiAgICAgICAgeCA9ICggeCBeICh4ID4+IDI3KSApICogMHg5NGQwNDliYjEzMzExMWViOwogICAgICAgIHJldHVybiB4IF4gKHggPj4gMzEpOwogICAgfQogCiAgICBzaXplX3Qgb3BlcmF0b3IoKSh1aW50NjRfdCB4KSBjb25zdCB7CiAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IEZJWEVEX1JBTkRPTSA9IGNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKTsKICAgICAgICByZXR1cm4gc3BsaXRtaXg2NCh4ICsgRklYRURfUkFORE9NKTsKICAgIH0KfTsKIAp0ZW1wbGF0ZSA8Y2xhc3MgSywgY2xhc3MgVj4gdXNpbmcgSFQgPSBncF9oYXNoX3RhYmxlPEssIFYsIGN1c3RvbV9oYXNoPjsKIAp2b2lkIGdldF9zaGl0X2RvbmUoKSB7CiAgICBpbnQgbiwgeDsKICAgIGNpbiA+PiBuID4+IHg7CiAKICAgIHZlY3RvcjxpbnQ+IHQobik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGNpbiA+PiB0W2ldOwogICAgfQogCiAgICBpbnQgbCA9IG4gLyAyLCByID0gKG4gKyAxKSAvIDI7CiAKICAgIEhUPExvbmcsIGludD4gZnJlcUxlZnQ7CiAgICBmb3IgKGludCBtYXNrID0gMDsgbWFzayA8ICgxIDw8IGwpOyArK21hc2spIHsKICAgICAgICBMb25nIHN1bSA9IDA7CiAgICAgICAgYml0c2V0PDUwPiBidChtYXNrKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGw7ICsraSkgewogICAgICAgICAgICBpZiAoYnRbaV0pIHsKICAgICAgICAgICAgICAgIHN1bSArPSB0W2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICsrZnJlcUxlZnRbc3VtXTsKICAgIH0KIAogICAgTG9uZyBhbnMgPSAwOwogICAgZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCAoMSA8PCByKTsgKyttYXNrKSB7CiAgICAgICAgTG9uZyBzdW0gPSAwOwogICAgICAgIGJpdHNldDw1MD4gYnQobWFzayk7CiAgICAgICAgZm9yIChpbnQgaSA9IGw7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgaWYgKGJ0W2kgLSBsXSkgewogICAgICAgICAgICAgICAgc3VtICs9IHRbaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYW5zICs9IGZyZXFMZWZ0W3ggLSBzdW1dOwogICAgfQogCiAgICBjb3V0IDw8IGFuczsKfQogCnNpZ25lZCBtYWluKCkgewogICAgXzNia2FybQogCiAgICBpbnQgdHMgPSAxOwovLyAgICBjaW4gPj4gdHM7CiAgICB3aGlsZSAodHMtLSkgewogICAgICAgIGdldF9zaGl0X2RvbmUoKTsKICAgIH0KIAogICAgcmV0dXJuIDA7Cn0=