1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define all(a) begin(a),end(a)
#define FOR(x,val,to) for(int x=(val);x<int((to));++x)
#define FORE(x,val,to) for(auto x=(val);x<=(to);++x)
#define FORR(x,arr) for(auto &x: arr)
#define FORS(x,plus,arr) for(auto x = begin(arr)+(plus); x != end(arr); ++x)
#define FORREV(x,plus,arr) for(auto x = (arr).rbegin()+(plus); x !=(arr).rend(); ++x)
#define REE(s_) {cout<<s_<<'\n';exit(0);}
#define GETCIN(arr) for(auto &i: (arr)) cin>>i
#define GET(arr) for(auto &i: (arr)) sc(i)
#define GETSTR(arr) for(auto &i: (arr)) getstr(i)
#define SINF 1061109567 //Safe INF, for graphs or 2d arrays 63 in memset(arr,63,size)
#define LL_INF 7234017283807667300 //100 in memset(arr,100,size) !!!must be LL
#define whatis(x) cerr << #x << " is " << x << endl;
#define e1 first
#define e2 second
typedef std::pair<int,int> pi;
typedef std::vector<int> vi;
typedef std::vector<std::string> vs;
typedef int64_t ll;
#define umap unordered_map
#define uset unordered_set
using namespace std;

#ifdef _WIN32
#define getchar_unlocked() _getchar_nolock()
#define _CRT_DISABLE_PERFCRIT_LOCKS
#endif
template<class T> ostream& operator<<(ostream &os, vector<T> V) { os<<"[";for(auto const &vv:V)os<<vv<<","; os<<"]"; return os; }
template<class L, class R> ostream& operator<<(ostream &os, pair<L, R> P) { os<<"("<<P.first<<","<<P.second<<")"; return os; }
template<typename T> inline void print_128(T num){ if(!num) return; print_128(num / 10); cout.put((num % 10) + '0'); }
inline int fstoi(const string &str){auto it=str.begin();bool neg=0;int num=0;if(*it=='-')neg=1;else num=*it-'0';++it;while(it<str.end()) num=num*10+(*it++-'0');if(neg)num*=-1;return num;}
inline void getch(char &x){while(x = getchar_unlocked(), x < 33){;}}
inline void getstr(string &str){str.clear(); char cur;while(cur=getchar_unlocked(),cur<33){;}while(cur>32){str+=cur;cur=getchar_unlocked();}}
template<typename T> inline bool sc(T &num){ int c; num=0; while(c=getchar_unlocked(),c<33){if(c == EOF) return false;} for(;c>47;c=getchar_unlocked()) num=num*10+c-48;  return true;}
template<typename T> inline T mod(T i, T n) { return (i % n + n) % n; }

#define ull unsigned long long
#define INF 18446744073709551614ull


ull k,n;

inline void sth(ull *p){
    static ull arr[900000];
    /* deque<ull> arr{1}; */
    int ind[k];
    memset(ind,0,k << 2);
    ull nxt[k];
    double logs[k];
    for(size_t i = 0; i < k; ++i){
        nxt[i] = p[i];
        logs[i] = log2(p[i]);
    }
    /* loop: */
    /*     arr.pb(*min_element(nxt,nxt+k)); */
    /*     if(arr.back() > n){ */
    /*         cout << *(arr.end()-2), exit(0); */
    /*     } */
    /*     for(size_t i = 0; i < k; ++i){ */
    /*         if(arr.back() == nxt[i]){ */
    /*             if(log2(arr[++ind[i]])+logs[i] > 64){ */
    /*                 nxt[i] = INF; */
    /*             } */
    /*             else{ */
    /*                 nxt[i] = arr[ind[i]]*p[i]; */
    /*             } */
    /*         } */
    /*     } */
    /* goto loop; */
    arr[0] = 1;
    ull *it = arr+1;
    loop:
        *it = *min_element(nxt,nxt+k);
        if(*it > n){
            cout << *(it-1), exit(0);
        }
        for(size_t i = 0; i < k; ++i){
            if(*it == nxt[i]){
                if(log2(arr[++ind[i]])+logs[i] > 64){
                    nxt[i] = INF;
                }
                else{
                    nxt[i] = arr[ind[i]]*p[i]; //overflow
                }
            }
        }
        ++it;
    goto loop;
}


int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    sc(k);
    sc(n);
    ull p[k];
    GET(p);
    if(k == 1){
        ull num = p[0];
        loop:
            if(log2(num)+log2(p[0]) > 64){
                REE(num)
            }
            if(num*p[0] > n){
                REE(num)
            }
            num *= p[0];
        goto loop;
    }
    else{
        sort(p,p+k);
        if(p[0] > n)
            REE(1)
        sth(p);
    }
}