#include <algorithm>
#include <cstdio>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define INT(x) int x; scanf("%d", &x)
#define LLG(x) LL x; scanf("%lld", &x)
typedef long long LL;
int k, k1, k2;
LL n;
int p[30], p1[30], p2[30];
bool use[30];
LL mem[1010000];
int num;
LL res;
void go1(int i, LL x) {
if (i == k1) {
mem[num++] = x;
return;
}
while (x <= n) {
go1(i + 1, x);
if (p1[i] > n / x) break;
x *= p1[i];
}
}
inline void check(LL x) {
int b = upper_bound(mem, mem + num, n / x) - mem;
res = max(res, x * mem[b - 1]);
}
void go2(int i, LL x) {
if (i == k2) {
check(x);
return;
}
if (p2[i] == 2) {
while (x <= n) {
check(x);
x <<= 1;
}
} else {
while (x <= n) {
go2(i + 1, x);
if (p2[i] > n / x) break;
x *= p2[i];
}
}
}
int main() {
INT(k0);
LLG(n0);
k = k0;
n = n0;
REP(i,k) scanf("%d", &p[i]);
sort(p, p + k);
use[1] = use[2] = use[3] = use[4] = use[5] = use[8] = use[21] = use[22] = 1;
REP(i,k) {
if (use[i]) p1[k1++] = p[i];
else p2[k2++] = p[i];
}
if (k2 > 1) rotate(p2, p2 + 1, p2 + k2);
go1(0, 1);
sort(mem, mem + num);
go2(0, 1);
printf("%lld\n", res);
}
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 | #include <algorithm> #include <cstdio> using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,n) FOR(i,0,n) #define INT(x) int x; scanf("%d", &x) #define LLG(x) LL x; scanf("%lld", &x) typedef long long LL; int k, k1, k2; LL n; int p[30], p1[30], p2[30]; bool use[30]; LL mem[1010000]; int num; LL res; void go1(int i, LL x) { if (i == k1) { mem[num++] = x; return; } while (x <= n) { go1(i + 1, x); if (p1[i] > n / x) break; x *= p1[i]; } } inline void check(LL x) { int b = upper_bound(mem, mem + num, n / x) - mem; res = max(res, x * mem[b - 1]); } void go2(int i, LL x) { if (i == k2) { check(x); return; } if (p2[i] == 2) { while (x <= n) { check(x); x <<= 1; } } else { while (x <= n) { go2(i + 1, x); if (p2[i] > n / x) break; x *= p2[i]; } } } int main() { INT(k0); LLG(n0); k = k0; n = n0; REP(i,k) scanf("%d", &p[i]); sort(p, p + k); use[1] = use[2] = use[3] = use[4] = use[5] = use[8] = use[21] = use[22] = 1; REP(i,k) { if (use[i]) p1[k1++] = p[i]; else p2[k2++] = p[i]; } if (k2 > 1) rotate(p2, p2 + 1, p2 + k2); go1(0, 1); sort(mem, mem + num); go2(0, 1); printf("%lld\n", res); } |
English