#include <algorithm> #include <cstdio> #include <vector> using namespace std; #define LL long long #define PB push_back #define GEN_LVLS 6 int power_counter = 0; LL powers[960000]; inline void new_power(LL a) { powers[power_counter++] = a; } LL N; vector<int> P; LL score = 1; bool can_multiply(LL a, LL b) { return a <= N / b; } void input(); void genrec(LL, int); void binrec(LL, int, int); void solve(); int main() { input(); solve(); printf("%lld\n", score); } void input() { int k, p; scanf("%d %lld", &k, &N); for (int i = 0; i < k; ++i) { scanf("%d", &p); P.PB(p); } sort(P.begin(), P.end()); } void genrec(LL act, int level) { while (can_multiply(act, P[level])) { if (level + 1 < GEN_LVLS && level + 1 < P.size() && can_multiply(act, P[level + 1])) { genrec(act, level + 1); } act *= P[level]; new_power(act); } } void solve() { new_power(1); genrec(1, 0); sort(powers, powers + power_counter); for (auto p : powers) { score = max(score, p); } if (P.size() > GEN_LVLS) { binrec(1, GEN_LVLS, power_counter - 1); } } void binrec(LL act, int level, int B) { int A, C; while (can_multiply(act, P[level])) { if (level < P.size() - 1 && can_multiply(act, P[level + 1])) { binrec(act, level + 1, B); } act *= P[level]; A = 0; if (!(can_multiply(act, powers[B]) && act * powers[B] <= score)) { while (A != B) { C = (A + B + 1) / 2; if (can_multiply(act, powers[C])) { A = C; } else { B = C - 1; } } } score = max(score, act * powers[A]); } }
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 97 | #include <algorithm> #include <cstdio> #include <vector> using namespace std; #define LL long long #define PB push_back #define GEN_LVLS 6 int power_counter = 0; LL powers[960000]; inline void new_power(LL a) { powers[power_counter++] = a; } LL N; vector<int> P; LL score = 1; bool can_multiply(LL a, LL b) { return a <= N / b; } void input(); void genrec(LL, int); void binrec(LL, int, int); void solve(); int main() { input(); solve(); printf("%lld\n", score); } void input() { int k, p; scanf("%d %lld", &k, &N); for (int i = 0; i < k; ++i) { scanf("%d", &p); P.PB(p); } sort(P.begin(), P.end()); } void genrec(LL act, int level) { while (can_multiply(act, P[level])) { if (level + 1 < GEN_LVLS && level + 1 < P.size() && can_multiply(act, P[level + 1])) { genrec(act, level + 1); } act *= P[level]; new_power(act); } } void solve() { new_power(1); genrec(1, 0); sort(powers, powers + power_counter); for (auto p : powers) { score = max(score, p); } if (P.size() > GEN_LVLS) { binrec(1, GEN_LVLS, power_counter - 1); } } void binrec(LL act, int level, int B) { int A, C; while (can_multiply(act, P[level])) { if (level < P.size() - 1 && can_multiply(act, P[level + 1])) { binrec(act, level + 1, B); } act *= P[level]; A = 0; if (!(can_multiply(act, powers[B]) && act * powers[B] <= score)) { while (A != B) { C = (A + B + 1) / 2; if (can_multiply(act, powers[C])) { A = C; } else { B = C - 1; } } } score = max(score, act * powers[A]); } } |