CSES - Shared codeLink to this code: https://cses.fi/paste/8da5925caa14ba0830529b/
#include <iostream>
#include <iomanip>
#include <ostream>
#include <fstream>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <bitset>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <array>
#include <algorithm>
#include <functional>
#include <cmath>
#include <time.h>
#include <random>
#include <chrono>
#include <cassert>
#include <cstring>
#include <climits>
#include <ext/rope>
#include <ext/pb_ds/detail/standard_policies.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
template <typename T> using ordered_set = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
constexpr int INF = INT_MAX-1;
constexpr ll LINF = LLONG_MAX-1;
constexpr ll MOD = 1000000007;
constexpr char nl = '\n';
constexpr long double eps = 1e-9;
#define pb push_back
#define F first
#define S second
#define pii pair<int,int>
#define tiii tuple<int,int,int>
#define vi vector<int>
#define vvi vector<vector<int>>
#define vii vector<pii>
#define vc vector
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define incr(i,a,b) for (ll i=a; i<b; ++i)
#define decr(i,a,b) for (ll i=a; i>b; --i)
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define setpr(x) cout<<setprecision(x)<<fixed
#define sz(x) (int)x.size()
#define seea(a,x,y) for(int i=x;i<y;i++){cin>>a[i];}
#define seev(v,n) for(int i=0;i<n;i++){int x; cin>>x; v.push_back(x);}
#define sees(s,n) for(int i=0;i<n;i++){int x; cin>>x; s.insert(x);}
#define fca(a,s) for(const auto & a: s)
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
template <typename T> inline T abs(T &x) {return(x<0 ? -x : x);}
template <typename T> ostream& operator<<(ostream &out, const vector<T> &v) {for (auto &it : v) {out << it << " ";}return out;}
template <typename T1, typename T2> ostream& operator<<(ostream &out, const pair<T1, T2> &v) {out << v.fi << " " << v.se;return out;}
template <typename T> inline T pw(T x) {return x*x;}
template <typename T> inline T pw2(T x){return 1LL<<x;}
template <typename T> inline T gcd(T a, T b){
if (b==0) return a;
else return gcd(b,a%b);
}
template <typename T> inline T bin_cof(T n, T k, ull mod = LLONG_MAX){
if (k==n || k==0) return 1LL;
else return bin_cof(n-1,k-1,mod)%mod+bin_cof(n-1,k,mod)%mod;
}
template <typename T> inline T factorial(T n){
if(n==1) return 1LL;
else return n*factorial(n-1);
}
template <typename T>
T pow(T a, T poww,long long mod = LLONG_MAX){
if (a == 1 || poww == 0) return 1LL;
else if (poww == 1) return a%=mod;
else {
T part = pow(a, poww >> 1,mod)%mod;
if (poww & 1) return (((part * part)%mod) * a)%mod;
else return (part * part)%mod;
}
}
inline void prepare(){
freopen("C:\\Users\\grivi\\vscodes\\.vscode\\input.txt", "r", stdin);
freopen("C:\\Users\\grivi\\vscodes\\.vscode\\output.txt", "w", stdout);
}
struct myh {
static uint64_t splitmix64(uint64_t x) {
// http://xorshift.di.unimi.it/splitmix64.c
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);
}
};
unordered_map<ll,ll,myh> mp;
inline void solve(){
ll n, k; cin>>n>>k;
vector<ll> v1, v2;
for (ll i = 0; i < n/2; i++) {
ll x; cin>>x;
v1.push_back(x);
}
for (ll i = n/2; i < n; i++) {
ll x; cin>>x;
v2.push_back(x);
}
ll n1 = n/2;
ll n2 = n - n/2;
for (ll i = 0; i < (1<<n1); i++) {
ll x = 0, y = 0, st = i;
while(st > 0) {
if (st&1) x += v1[y];
y++; st>>=1;
}
mp[x]++;
}
ll ans = 0;
for (ll i = 0; i < (1<<n2); i++) {
ll x = 0, y = 0, st = i;
while(st > 0) {
if (st&1) x+= v2[y];
y++; st>>=1;
}
if (mp.count(k-x)) ans += mp[k-x];
}
cout<<ans;
}
signed main(){
IOS;
// prepare();
size_t tt = 1;
// cin >> tt;
while(tt--) solve();
return 0;
}