#include using namespace std; int main() { int n,S; cin >> n >> S; vectora(n); for(int i = 0; i < n; i++) { cin >> a[i]; } mapmp; mp[0] = 1; for(int i = 0; i < n/2; i++) { mapnmp; for(auto j:mp) { long long s = 1; for(int k = 1; ; k++) { s *= a[i]; if(s+j.first > S) { break; } nmp[s+j.first] += j.second; } } swap(mp,nmp); } mapmp2; mp2[0] = 1; for(int i = 0; i < n-n/2; i++) { mapnmp; for(auto j:mp2) { long long s = 1; for(int k = 1; ; k++) { s *= a[n/2+i]; if(s+j.first > S) { break; } nmp[s+j.first] += j.second; } } swap(mp2,nmp); } vectorid; vectorsum; vector>tmp; for(auto i:mp2) { tmp.push_back(i); } sort(tmp.begin(),tmp.end()); id.resize(tmp.size()); sum.resize(tmp.size()); for(int i = 0; i < tmp.size(); i++) { id[i] = tmp[i].first; sum[i] = tmp[i].second; if(i) { sum[i] += sum[i-1]; } } long long ans = 0; for(auto i:mp) { int it = upper_bound(id.begin(),id.end(),S-i.first)-id.begin(); if(it) { ans += i.second*sum[it-1]; } } cout << ans << endl; }