//Pawel Hanusik #include <cstdio> #include <math.h> #include <time.h> int getHighestWyk(const unsigned long long &i, const int &podstawa) { return ceil(log2(i) / log2(podstawa)); } int main() { unsigned long long ret = 0; int dzielniki[100]; int dzielLast = -1; unsigned long long N; int k; scanf("%d %llu", &k, &N); for (int i = 0; i < k; ++i) { scanf("%d", &dzielniki[i]); } dzielLast = k-1; int wykladniki[100]; int wykLast = -1; int maxWykladniki[100]; int maxWykLast = -1; for (int i = 0; i < k; ++i) { maxWykladniki[i] = getHighestWyk(N, dzielniki[i]); wykladniki[i] = maxWykladniki[i]; } wykLast = k-1; maxWykLast = k - 1; int wsk = k-1; while (wsk > -1) { --wykladniki[wsk]; if (wykladniki[wsk] < 0) { wykladniki[wsk] = maxWykladniki[wsk]+1; wsk -= 2; } if (wsk != k-1) { wsk++; } else { unsigned long long iloczyn = 1; int w = 0; while (iloczyn <= N && w < k) { iloczyn *= pow(dzielniki[w], wykladniki[w]); ++w; } if (w < k){ --wykladniki[w - 1]; for (int i = w; i <= k - 1; ++i) { wykladniki[i] = maxWykladniki[i]; } wsk = k - 1; }else if(iloczyn <= N){ if (ret < iloczyn) { ret = iloczyn; } } } } printf("%llu\n", ret); 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 | //Pawel Hanusik #include <cstdio> #include <math.h> #include <time.h> int getHighestWyk(const unsigned long long &i, const int &podstawa) { return ceil(log2(i) / log2(podstawa)); } int main() { unsigned long long ret = 0; int dzielniki[100]; int dzielLast = -1; unsigned long long N; int k; scanf("%d %llu", &k, &N); for (int i = 0; i < k; ++i) { scanf("%d", &dzielniki[i]); } dzielLast = k-1; int wykladniki[100]; int wykLast = -1; int maxWykladniki[100]; int maxWykLast = -1; for (int i = 0; i < k; ++i) { maxWykladniki[i] = getHighestWyk(N, dzielniki[i]); wykladniki[i] = maxWykladniki[i]; } wykLast = k-1; maxWykLast = k - 1; int wsk = k-1; while (wsk > -1) { --wykladniki[wsk]; if (wykladniki[wsk] < 0) { wykladniki[wsk] = maxWykladniki[wsk]+1; wsk -= 2; } if (wsk != k-1) { wsk++; } else { unsigned long long iloczyn = 1; int w = 0; while (iloczyn <= N && w < k) { iloczyn *= pow(dzielniki[w], wykladniki[w]); ++w; } if (w < k){ --wykladniki[w - 1]; for (int i = w; i <= k - 1; ++i) { wykladniki[i] = maxWykladniki[i]; } wsk = k - 1; }else if(iloczyn <= N){ if (ret < iloczyn) { ret = iloczyn; } } } } printf("%llu\n", ret); return 0; } |