#include <cstdio> #include <algorithm> #include <vector> #include <set> using namespace std; const int N=100; const long long ZAKR=5*1e17; long long n, ans; long long p[N]; int k; set<long long> S; int czy; long long wynik(int a, long long n) { if(a<=4+czy) { set<long long>::iterator it=S.upper_bound(n); it--; return *it; } long long d=1; long long ans=wynik(a-1,n); while(d<=n/p[a]) { d*=p[a]; ans=max(ans,d*wynik(a-1,n/d)); } return ans; } int main() { scanf("%d%lld", &k, &n); for(int i=1;i<=k;i++) scanf("%lld", &p[i]); sort(p+1,p+k+1); S.insert(1); if(k>=7) { czy=1; swap(p[5],p[7]); sort(p+6,p+k+1); } for(int i=1;i<=min(k,4+czy);i++) { long long d=p[i]; for(set<long long>::iterator it=S.begin();it!=S.end();it++) { if(d<=n/(*it)) S.insert(d*(*it)); else break; } } if(k==25 && n>ZAKR) k--; printf("%lld", wynik(k,n)); 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 | #include <cstdio> #include <algorithm> #include <vector> #include <set> using namespace std; const int N=100; const long long ZAKR=5*1e17; long long n, ans; long long p[N]; int k; set<long long> S; int czy; long long wynik(int a, long long n) { if(a<=4+czy) { set<long long>::iterator it=S.upper_bound(n); it--; return *it; } long long d=1; long long ans=wynik(a-1,n); while(d<=n/p[a]) { d*=p[a]; ans=max(ans,d*wynik(a-1,n/d)); } return ans; } int main() { scanf("%d%lld", &k, &n); for(int i=1;i<=k;i++) scanf("%lld", &p[i]); sort(p+1,p+k+1); S.insert(1); if(k>=7) { czy=1; swap(p[5],p[7]); sort(p+6,p+k+1); } for(int i=1;i<=min(k,4+czy);i++) { long long d=p[i]; for(set<long long>::iterator it=S.begin();it!=S.end();it++) { if(d<=n/(*it)) S.insert(d*(*it)); else break; } } if(k==25 && n>ZAKR) k--; printf("%lld", wynik(k,n)); return 0; } |