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
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

typedef long long ll;

vector<int> generate(const vector<int> &p, int limit)
{
    vector<int> result = { 1 };
    for(auto x: p)
        for(int i = 0; i < result.size(); i++)
            if(1LL * x * result[i] <= limit) result.push_back(x * result[i]);
    sort(result.begin(), result.end());
    return result;
}

int main()
{
    int n;
    ll k;
    scanf("%d %lld", &n, &k);
    vector<int> va, vb;
    while(n--)
    {
        int p;
        scanf("%d", &p);
        if(p < 20) va.push_back(p);
        else vb.push_back(p);
    }
    ll ans = 0;
    int limit = 10;
    while(1LL * limit * limit < k)
        limit *= 10;
    limit = min((ll)limit, k);
    for(int i = 0; i < 2; i++)
    {
        auto gb = generate(vb, limit);
        ll st[100] = { 1LL, 0LL };
        int m = 1;
        ans = max(ans, (ll)gb.back());
        while(true)
        {
            int j = m - 1;
            if(j < 0) break;
            if(j == va.size() || st[m] > k / va[j] || st[m] * va[j] > k) m--;
            else if(st[m] == 0)
            {
                st[m] = st[m-1];
                st[++m] = 0;
            }
            else
            {
                st[m] *= va[j];
                if(k / st[m] * st[m] <= ans)
                {
                    m--;
                    continue;
                }
                ll t = *(upper_bound(gb.begin(), gb.end(), k / st[m]) - 1);
                ans = max(ans, st[m] * t);
                st[++m] = 0;
            }
        }
        va.swap(vb);
    }
    printf("%lld\n", ans);
}