#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
int k;
ll N;
int primes[30];
ll small[960000];
int small_cnt, big_cnt;
ll mem[30], mem2[30];
ll tmp, tmp2, res;
void cnt(int i) {
if(i == min(6, k)) {
small[small_cnt++] = tmp2;
return ;
}
mem[i] = tmp, mem2[i] = tmp2;
while(tmp >= 1) {
if(tmp < primes[i]) {
small[small_cnt++] = tmp2;
break;
}
cnt(i + 1);
tmp /= ll(primes[i]);
tmp2 *= ll(primes[i]);
}
tmp = mem[i];
tmp2 = mem2[i];
}
ll biggest(const ll &n) {
int pocz = 0, kon = small_cnt - 1, mid;
while(pocz < kon) {
mid = (pocz + kon + 1) >> 1;
if(small[mid] <= n)
pocz = mid;
else
kon = mid - 1;
}
return small[pocz];
}
void cnt2(int i) {
if(i == k) {
ll x = biggest(tmp) * tmp2;
if(x <= N)
res = (res > x) ? res : x;
return ;
}
mem[i] = tmp, mem2[i] = tmp2;
while(tmp >= 1) {
if(tmp < primes[i]) {
ll x = biggest(tmp) * tmp2;
if(x <= N)
res = (res > x) ? res : x;
break;
}
cnt2(i + 1);
tmp /= ll(primes[i]);
tmp2 *= ll(primes[i]);
}
tmp = mem[i];
tmp2 = mem2[i];
}
int main() {
scanf("%d %lld", &k, &N);
for(int i = 0 ; i < k ; i++)
scanf("%d", &primes[i]);
sort(primes, primes + k);
tmp = N, tmp2 = 1;
cnt(0);
sort(small, small + small_cnt);
if(k <= 6) {
printf("%lld\n", biggest(N));
return 0;
}
tmp = N, tmp2 = 1;
cnt2(6);
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 97 | #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; int k; ll N; int primes[30]; ll small[960000]; int small_cnt, big_cnt; ll mem[30], mem2[30]; ll tmp, tmp2, res; void cnt(int i) { if(i == min(6, k)) { small[small_cnt++] = tmp2; return ; } mem[i] = tmp, mem2[i] = tmp2; while(tmp >= 1) { if(tmp < primes[i]) { small[small_cnt++] = tmp2; break; } cnt(i + 1); tmp /= ll(primes[i]); tmp2 *= ll(primes[i]); } tmp = mem[i]; tmp2 = mem2[i]; } ll biggest(const ll &n) { int pocz = 0, kon = small_cnt - 1, mid; while(pocz < kon) { mid = (pocz + kon + 1) >> 1; if(small[mid] <= n) pocz = mid; else kon = mid - 1; } return small[pocz]; } void cnt2(int i) { if(i == k) { ll x = biggest(tmp) * tmp2; if(x <= N) res = (res > x) ? res : x; return ; } mem[i] = tmp, mem2[i] = tmp2; while(tmp >= 1) { if(tmp < primes[i]) { ll x = biggest(tmp) * tmp2; if(x <= N) res = (res > x) ? res : x; break; } cnt2(i + 1); tmp /= ll(primes[i]); tmp2 *= ll(primes[i]); } tmp = mem[i]; tmp2 = mem2[i]; } int main() { scanf("%d %lld", &k, &N); for(int i = 0 ; i < k ; i++) scanf("%d", &primes[i]); sort(primes, primes + k); tmp = N, tmp2 = 1; cnt(0); sort(small, small + small_cnt); if(k <= 6) { printf("%lld\n", biggest(N)); return 0; } tmp = N, tmp2 = 1; cnt2(6); printf("%lld\n", res); return 0; } |
English