#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; } |