//  main.cpp
//  ABC182F
#include <iostream>
#include <vector>
#include <cmath>
#include <map>
using namespace std;
#define rep(i,n) for (int i = 0; i < (n); ++i)
using ll = long long;
using P = pair<int,int>;

int main(int argc, const char * argv[]) {
    int n;
    cin>>n; // コインの種類数、コインが１円だけの時、払い方は１通り
    if(n==1){
        cout<<1<<endl;
        return 0;
    }
    ll x;
    cin>>x; // 代金
    vector<ll>a(n); // コイン
    rep(i,n) cin>>a[i];
    if(x%a[n-1]==0){
        cout<<1<<endl;
        return 0;
    }
    vector<ll>r(n); // 使える枚数
    rep(i,n-1) r[i]=a[i+1]/a[i]-1;
    r[n-1]=x/a[n-1];
    vector<ll> d(2); // 代金との差額
    d[0]=a[n-1]*r[n-1]-x;
    d[1]=a[n-1]*(r[n-1]+1)-x;
    ll e=0;
    // i番目までで、代金との差d=map->firstになる個数
    // 代金との差はたかだか２種類、数値が大きいのでmapで管理する
    vector<vector<int>>dp(n,vector<int>(2));
    dp[n-1][0]=1;
    dp[n-1][1]=1;
    map<ll,ll>mp0,mp1;
    int i=n-2;
    while(d[0]!=0){
        mp0.clear();
        if(abs(d[0])<a[i]) mp0[d[0]]++;
        ll lmt0=d[0]/a[i]; // 調査する範囲を絞る　TLE解消
        for(ll j=lmt0-1;j<=lmt0+1;j++){
            if(j==0)continue;
            if(abs(j)>r[i])continue;
            e=d[0]+a[i]*j;
            if(abs(e)<a[i]){
                mp0[e]++;
                if(mp0.size()==2) break;
            }
            e=d[0]-a[i]*j;
            if(abs(e)<a[i]){
                mp0[e]++;
                if(mp0.size()==2) break;
            }
        }
        map<ll,int>nd;// 次のdの候補
        for(auto es=mp0.begin();es!=mp0.end();es++){
            nd[es->first]++;
            if(mp0.begin()->first==es->first){
                dp[i][0]+=es->second*dp[i+1][0];
            }else{
                dp[i][1]+=es->second*dp[i+1][0];
            }
        }
        mp1.clear();
        if(abs(d[1])<a[i]) mp1[d[1]]++;
        ll lmt1=d[1]/a[i]; // 調査する範囲を絞る　TLE解消
        for(ll j=lmt1-1;j<=lmt1+1;j++){
            if(j==0) continue;
            if(abs(j)>r[i])continue;
            e=d[1]+a[i]*j;
            if(abs(e)<a[i]){
                mp1[e]++;
                if(mp1.size()==2) break;
            }
            e=d[1]-a[i]*j;
            if(abs(e)<a[i]){
                mp1[e]++;
                if(mp1.size()==2) break;
            }
        }
        for(auto es=mp1.begin();es!=mp1.end();es++){
            nd[es->first]++;
            if(mp0.begin()->first==es->first){
                dp[i][0]+=es->second*dp[i+1][1];
            }else{
                dp[i][1]+=es->second*dp[i+1][1];
            }
        }
        int d_cnt=0;
        for(auto cs=nd.begin();cs!=nd.end();cs++){
            d[d_cnt]=cs->first;
            d_cnt++;
        }
        i--;
        if(i<0) i=0;
    }
    ll ans=dp[i+1][0]+dp[i+1][1];

    cout<<ans<<endl;
    return 0;
}
/*
 2 300
 1 100
 */

#include<bits/stdc++.h>
using namespace std;
#define eps 1e-10
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<r;i++)
#define rrep(i,r,l) for(int i=r-1;i>=l;i--)
typedef long long ll;
int n;
ll x,a[55],b[55];
map<ll,int> v;
int main()
{
	scanf("%d%lld",&n,&x);
	rep(i,0,n) scanf("%lld",&a[i]);
 	rep(i,0,n-1) b[i]=a[i+1]/a[i];
	v[x%a[n-1]]=1;
	if(x%a[n-1]!=0) v[x%a[n-1]-a[n-1]]=1;
	rrep(i,n-1,0){
		map<ll,int> u;
		for(auto x:v){
			ll c=(x.first+a[i+1])%a[i];
			ll d=(x.first-c)/a[i];
			if(abs(d)<b[i]) u[c]+=x.second;
			if(c&&abs(d+1)<b[i]) u[c-a[i]]+=x.second;
		}
		v.clear(),v=u;
	}
	printf("%lld\n",v[0]);
	return 0;
}