#include <bits/stdc++.h>
using namespace std;
#define REP(i,a,b) for (int i = (a); i <= (b); ++i)
#define REPD(i,a,b) for (int i = (a); i >= (b); --i)
#define FORI(i,n) REP(i,1,n)
#define FOR(i,n) REP(i,0,int(n)-1)
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define vi vector<int>
#define ll long long
#define SZ(x) int((x).size())
#define DBG(v) cerr << #v << " = " << (v) << endl;
#define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++)
#define fi first
#define se second
const int K = 25;
const ll mx = 400000001LL;
ll pr[K];
int k;
int tot;
int q;
int all[1900100];
void rec(int p, ll v) {
if (p==k) {
all[q++] = v;
return;
}
for (; v<mx; v*=pr[p]) {
rec(p+1, v);
}
}
int main() {
ll n;
ll res = 1;
scanf("%d%lld", &k, &n);
FOR(i,k) scanf("%lld", &pr[i]);
rec(0, 1);
sort(all, all+q);
//fprintf(stderr, "%d\n", q);
if (k==1) {
for (int i=1; i<20; i++) {
pr[k] = pr[k-1] * pr[0];
if (pr[k]<=n) res = max(res, pr[k]);
k++;
}
} else if (k==2) {
FOR(i,4) FOR(j,4) if (i+j>1) {
ll c=1;
FOR(qq,i) {
c*=pr[0];
if (c>n) break;
}
FOR(qq,j) {
c*=pr[1];
if (c>n) break;
}
if (c<=n) {
res = max(res, c);
pr[k++] = c;
}
}
}
if (k<=6) {
FOR(a,k) {
int sti=q-1;
FOR(b,k) {
ll target = n/pr[a]/pr[b], mul = pr[a]*pr[b];
while (sti>=0 && target < all[sti]) sti--;
int j = 0;
for (int i=sti; i >= 0; i--) {
while (j<q && target/all[j] >= all[i]) j++;
if (j>0) res = max(res, mul*all[i]*all[j-1]);
}
}
}
} else {
FOR(a,k) {
int sti=q-1;
ll target = n/pr[a], mul = pr[a];
while (sti>=0 && target < all[sti]) sti--;
int j = 0;
for (int i=sti; i >= 0; i--) {
while (j<q && target/all[j] >= all[i]) j++;
if (j>0) res = max(res, mul*all[i]*all[j-1]);
}
}
}
printf("%lld\n", res);
return 0;
}
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 | #include <bits/stdc++.h> using namespace std; #define REP(i,a,b) for (int i = (a); i <= (b); ++i) #define REPD(i,a,b) for (int i = (a); i >= (b); --i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair<int,int> #define vi vector<int> #define ll long long #define SZ(x) int((x).size()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++) #define fi first #define se second const int K = 25; const ll mx = 400000001LL; ll pr[K]; int k; int tot; int q; int all[1900100]; void rec(int p, ll v) { if (p==k) { all[q++] = v; return; } for (; v<mx; v*=pr[p]) { rec(p+1, v); } } int main() { ll n; ll res = 1; scanf("%d%lld", &k, &n); FOR(i,k) scanf("%lld", &pr[i]); rec(0, 1); sort(all, all+q); //fprintf(stderr, "%d\n", q); if (k==1) { for (int i=1; i<20; i++) { pr[k] = pr[k-1] * pr[0]; if (pr[k]<=n) res = max(res, pr[k]); k++; } } else if (k==2) { FOR(i,4) FOR(j,4) if (i+j>1) { ll c=1; FOR(qq,i) { c*=pr[0]; if (c>n) break; } FOR(qq,j) { c*=pr[1]; if (c>n) break; } if (c<=n) { res = max(res, c); pr[k++] = c; } } } if (k<=6) { FOR(a,k) { int sti=q-1; FOR(b,k) { ll target = n/pr[a]/pr[b], mul = pr[a]*pr[b]; while (sti>=0 && target < all[sti]) sti--; int j = 0; for (int i=sti; i >= 0; i--) { while (j<q && target/all[j] >= all[i]) j++; if (j>0) res = max(res, mul*all[i]*all[j-1]); } } } } else { FOR(a,k) { int sti=q-1; ll target = n/pr[a], mul = pr[a]; while (sti>=0 && target < all[sti]) sti--; int j = 0; for (int i=sti; i >= 0; i--) { while (j<q && target/all[j] >= all[i]) j++; if (j>0) res = max(res, mul*all[i]*all[j-1]); } } } printf("%lld\n", res); return 0; } |
English