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
//PRZEMYSL ASSERTY
//SPRAWDZ CORNER CASE'Y, MINIMALNE I MAKSYMALNE WEJŚCIE I WYJŚCIE
//MODULO = 1
#include <cstdio>
#include <algorithm>
#define REP(i,n) for(int i=0;i<(n);++i)
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define FORD(i,a,b) for(int i=(a);i>=(b);--i)
#define foreach(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define all(c) (c).begin(),(c).end()
#define scanf(...) scanf(__VA_ARGS__)?:0
#define e1 first
#define e2 second
#define mp make_pair
using namespace std;
typedef long long ll;
int k,sz[25],a[25];//={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
int *num[25];
ll n,zak=1.1e8;
int main() {
	scanf("%d%lld",&k,&n);
	REP(i,k) scanf("%d",&a[i]);
	if (n<=45e7) zak=n;
	ll x=1;
	while (x<=zak) sz[0]++,x*=a[0];
	num[0]=new int[sz[0]];
	num[0][0]=1;
	FOR(i,1,sz[0]-1) num[0][i]=a[0]*num[0][i-1];
	FOR(i,1,k-1) {
		REP(j,i) REP(it,sz[j]) {
			ll x=num[j][it]*(ll)a[i];
			while (x<=zak) sz[i]++,x*=a[i];
		}
		num[i]=new int[sz[i]];
		int poz=0;
		REP(j,i) REP(it,sz[j]) {
			ll x=(ll)num[j][it]*a[i];
			while (x<=zak) num[i][poz++]=x,x*=a[i];
		}
	}
	ll ans=0;
	REP(i,k) REP(j,sz[i]) if (num[i][j]>ans) ans=num[i][j];
	if (zak==n) {
		printf("%lld\n",ans);
		return 0;
	} else {
		int size=0,poz=0;
		REP(i,k) size+=sz[i];
		int tab[size];
		REP(i,k) REP(j,sz[i]) tab[poz++]=num[i][j];
		REP(i,k) delete[] num[i];
		sort(tab,tab+size);
		FORD(i,size-1,0) {
			ll mv=n/tab[i];
			if (mv>=tab[size-1]) {
				ans=max(ans,(ll)tab[i]*tab[size-1]);
				break;
			} else {
				int xd=*(upper_bound(tab,tab+size,mv)-1);
				ans=max(ans,(ll)tab[i]*xd);
			}
		}
		printf("%lld\n",ans);
	}
}