#include <cstdio> #include <vector> #include <stdint.h> #include <algorithm> using namespace std; int k; uint64_t N; vector<uint8_t> P; vector<vector<uint64_t> > PP; uint64_t global_result; void calculate(uint64_t result, uint64_t restN, int z) { while (z<k-1 && restN<P[z]) ++z; for (int i=PP[z].size()-1; i>=0; --i) { if (restN < PP[z][i]) continue; uint64_t new_result = result * PP[z][i]; uint64_t new_restN = restN / PP[z][i]; if (z == k-1) { if (global_result < new_result) global_result = new_result; } else calculate(new_result, new_restN, z + 1); } } int main() { scanf("%d %llu", &k, &N); P.resize(k); PP.resize(k); for(int i=0; i<k; ++i) scanf("%d", &P[i]); sort(P.begin(), P.end()); for (int i=0; i<k; ++i) { PP[i].push_back(1); while (PP[i].back() <= N / P[i]) { PP[i].push_back(PP[i].back() * P[i]); } } global_result = 1; calculate(1, N, 0); printf("%llu\n", global_result); }
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 | #include <cstdio> #include <vector> #include <stdint.h> #include <algorithm> using namespace std; int k; uint64_t N; vector<uint8_t> P; vector<vector<uint64_t> > PP; uint64_t global_result; void calculate(uint64_t result, uint64_t restN, int z) { while (z<k-1 && restN<P[z]) ++z; for (int i=PP[z].size()-1; i>=0; --i) { if (restN < PP[z][i]) continue; uint64_t new_result = result * PP[z][i]; uint64_t new_restN = restN / PP[z][i]; if (z == k-1) { if (global_result < new_result) global_result = new_result; } else calculate(new_result, new_restN, z + 1); } } int main() { scanf("%d %llu", &k, &N); P.resize(k); PP.resize(k); for(int i=0; i<k; ++i) scanf("%d", &P[i]); sort(P.begin(), P.end()); for (int i=0; i<k; ++i) { PP[i].push_back(1); while (PP[i].back() <= N / P[i]) { PP[i].push_back(PP[i].back() * P[i]); } } global_result = 1; calculate(1, N, 0); printf("%llu\n", global_result); } |