#include <bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N = 2e5 + 9;
LL n, n2;
LL result = 0LL;
int cnt;
LL tab[N];
int k;
int pm, stop;
int primes[30];
inline LL kwa(LL a){
return a * a;
}
LL find(LL x){
if(tab[1] > x)
return 1LL;
int p = 1, k = cnt;
while(p < k){
int m = (p + k + 1) >> 1;
if(tab[m] <= x)
p = m;
else
k = m - 1;
}
return tab[p];
}
void add(int cur, int m){
if(cur == stop)
return;
if(1LL * m * primes[cur] <= n2){
add(cur, m * primes[cur]);
tab[++cnt] = 1LL * m * primes[cur] * pm;
add(cur + 1, m);
}
}
void check(int cur, int m){
if(cur == stop)
return;
if(1LL * m * primes[cur] <= n2){
check(cur, m * primes[cur]);
if(1LL * m * primes[cur] * pm >= n2)
result = max(result, 1LL * m * primes[cur] * find(n / (1LL * m * primes[cur])));
check(cur + 1, m);
}
}
int main(){
scanf("%d %lld", &k, &n);
for(int i = 0; i < k; ++i)
scanf("%d", &primes[i]);
sort(primes, primes + k);
n2 = sqrt(n);
while(kwa(n2 + 1) <= n)
++n2;
while(kwa(n2) > n)
--n2;
for(int i = 0; i < k; ++i){
tab[1] = 1;
cnt = 1; pm = primes[i];
if(i < 9){
stop = i + 1;
add(0, 1);
}
else{
stop = k;
add(i, 1);
}
tab[1] *= pm;
sort(tab + 1, tab + cnt + 1);
if(i < 9){
stop = k;
check(i, 1);
}
else{
stop = i + 1;
check(0, 1);
}
result = max(result, find(n));
}
printf("%lld\n", result);
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 98 99 100 101 102 103 104 | #include <bits/stdc++.h> using namespace std; typedef long long int LL; const int N = 2e5 + 9; LL n, n2; LL result = 0LL; int cnt; LL tab[N]; int k; int pm, stop; int primes[30]; inline LL kwa(LL a){ return a * a; } LL find(LL x){ if(tab[1] > x) return 1LL; int p = 1, k = cnt; while(p < k){ int m = (p + k + 1) >> 1; if(tab[m] <= x) p = m; else k = m - 1; } return tab[p]; } void add(int cur, int m){ if(cur == stop) return; if(1LL * m * primes[cur] <= n2){ add(cur, m * primes[cur]); tab[++cnt] = 1LL * m * primes[cur] * pm; add(cur + 1, m); } } void check(int cur, int m){ if(cur == stop) return; if(1LL * m * primes[cur] <= n2){ check(cur, m * primes[cur]); if(1LL * m * primes[cur] * pm >= n2) result = max(result, 1LL * m * primes[cur] * find(n / (1LL * m * primes[cur]))); check(cur + 1, m); } } int main(){ scanf("%d %lld", &k, &n); for(int i = 0; i < k; ++i) scanf("%d", &primes[i]); sort(primes, primes + k); n2 = sqrt(n); while(kwa(n2 + 1) <= n) ++n2; while(kwa(n2) > n) --n2; for(int i = 0; i < k; ++i){ tab[1] = 1; cnt = 1; pm = primes[i]; if(i < 9){ stop = i + 1; add(0, 1); } else{ stop = k; add(i, 1); } tab[1] *= pm; sort(tab + 1, tab + cnt + 1); if(i < 9){ stop = k; check(i, 1); } else{ stop = i + 1; check(0, 1); } result = max(result, find(n)); } printf("%lld\n", result); return 0; } |
English