#include <cstdio>
#include <algorithm>
const int MAX = 110;
const int CHECKN = 1001000;
int k;
long long n;
long long t[MAX];
int C[CHECKN];
long long check(int i, long long prod) {
long long ret = 1;
for (int c = i; c < k; c++) {
long long m = n / prod / t[c];
if (m < CHECKN) {
if (C[m]) {
ret = std::max(ret, C[m] * prod * t[c]);
}
} else {
ret = std::max(ret, check(c, prod * t[c]));
}
}
return ret;
}
int main(int argc, char *argv[]) {
scanf("%i%lli", &k, &n);
for (int c = 0; c < k; c++) {
scanf("%lli", t + c);
}
std::sort(t, t + k);
std::reverse(t, t + k);
C[1] = true;
long long r = 1;
for (int i = 1; i < CHECKN && i <= n; i++) {
if (C[i]) {
r = i;
for (int c = 0; c < k; c++) {
if (i * t[c] < CHECKN) {
C[i * t[c]] = true;
}
}
}
C[i] = r;
}
if (n >= CHECKN) {
r = std::max(r, check(0, 1));
}
printf("%lli\n", r);
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 | #include <cstdio> #include <algorithm> const int MAX = 110; const int CHECKN = 1001000; int k; long long n; long long t[MAX]; int C[CHECKN]; long long check(int i, long long prod) { long long ret = 1; for (int c = i; c < k; c++) { long long m = n / prod / t[c]; if (m < CHECKN) { if (C[m]) { ret = std::max(ret, C[m] * prod * t[c]); } } else { ret = std::max(ret, check(c, prod * t[c])); } } return ret; } int main(int argc, char *argv[]) { scanf("%i%lli", &k, &n); for (int c = 0; c < k; c++) { scanf("%lli", t + c); } std::sort(t, t + k); std::reverse(t, t + k); C[1] = true; long long r = 1; for (int i = 1; i < CHECKN && i <= n; i++) { if (C[i]) { r = i; for (int c = 0; c < k; c++) { if (i * t[c] < CHECKN) { C[i * t[c]] = true; } } } C[i] = r; } if (n >= CHECKN) { r = std::max(r, check(0, 1)); } printf("%lli\n", r); return 0; } |
English