#include <cstdio> #include <cmath> //wersja 2 - potegi + 1 long long int k; unsigned long long int N; int pierwsze[40]; int potegi[40]; //int potegi_max[40]; long long int gora[40]; int iloczyn_gor=1; unsigned long long int maximum=0; double liczba_teraz=1.0; long long int sprawdzana; long long int sprawdzana_tmp; int main() { scanf("%lld %llud",&k,&N); for(int i=0;i<k;i++) { scanf("%d",&pierwsze[i]); } for(int i=0;i<k;i++) { gora[i]=ceil(log((double)N)/log((double)pierwsze[i]))+1; //printf("%lld\n",gora[i]); } /*for(int i=0;i<k;i++) { iloczyn_gor=iloczyn_gor*gora[i]; }*/ //printf("%d\n",iloczyn_gor); if(k>6) { sprawdzana=N; for(;;) { sprawdzana_tmp=sprawdzana; for(int i=0;i<k-1;i++) { while(sprawdzana_tmp%pierwsze[i]==0) sprawdzana_tmp=sprawdzana_tmp/pierwsze[i]; //printf("%lld\n",sprawdzana_tmp); } while(sprawdzana_tmp%pierwsze[k-1]==0) sprawdzana_tmp=sprawdzana_tmp/pierwsze[k-1]; if(sprawdzana_tmp==1) break; sprawdzana--; } printf("%lld",sprawdzana); }else{ while(true) { liczba_teraz=1; for(int i=0;i<k;i++) { liczba_teraz=liczba_teraz*pow( double(pierwsze[i]),double(potegi[i])); } if(liczba_teraz<=N) { //printf("%lld\n",liczba_teraz); if(liczba_teraz>maximum) { maximum=liczba_teraz; /*for(int i=0;i<k;i++) { potegi_max[i]=potegi[i]; }*/ } } //printf("%lld\n",liczba_teraz); potegi[k-1]+=1; if(potegi[0]>gora[0]) break; //printf("%d\n",potegi[k-1]); if(potegi[k-1]>gora[k-1]) { //printf("%d>%d\n",potegi[k-1],gora[k-1]); potegi[k-1]=0; potegi[k-2]+=1; for(int i=k-2;i>0;i--) { if(potegi[i]>gora[i]) { potegi[i-1]+=1; potegi[i]=0; }else{ break; } } } } printf("%llu\n",maximum); /*for(int i=0;i<k;i++) { printf("%d ",pierwsze[i]); } printf("\n"); for(int i=0;i<k;i++) { printf("%d ",potegi_max[i]); }*/ } 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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <cstdio> #include <cmath> //wersja 2 - potegi + 1 long long int k; unsigned long long int N; int pierwsze[40]; int potegi[40]; //int potegi_max[40]; long long int gora[40]; int iloczyn_gor=1; unsigned long long int maximum=0; double liczba_teraz=1.0; long long int sprawdzana; long long int sprawdzana_tmp; int main() { scanf("%lld %llud",&k,&N); for(int i=0;i<k;i++) { scanf("%d",&pierwsze[i]); } for(int i=0;i<k;i++) { gora[i]=ceil(log((double)N)/log((double)pierwsze[i]))+1; //printf("%lld\n",gora[i]); } /*for(int i=0;i<k;i++) { iloczyn_gor=iloczyn_gor*gora[i]; }*/ //printf("%d\n",iloczyn_gor); if(k>6) { sprawdzana=N; for(;;) { sprawdzana_tmp=sprawdzana; for(int i=0;i<k-1;i++) { while(sprawdzana_tmp%pierwsze[i]==0) sprawdzana_tmp=sprawdzana_tmp/pierwsze[i]; //printf("%lld\n",sprawdzana_tmp); } while(sprawdzana_tmp%pierwsze[k-1]==0) sprawdzana_tmp=sprawdzana_tmp/pierwsze[k-1]; if(sprawdzana_tmp==1) break; sprawdzana--; } printf("%lld",sprawdzana); }else{ while(true) { liczba_teraz=1; for(int i=0;i<k;i++) { liczba_teraz=liczba_teraz*pow( double(pierwsze[i]),double(potegi[i])); } if(liczba_teraz<=N) { //printf("%lld\n",liczba_teraz); if(liczba_teraz>maximum) { maximum=liczba_teraz; /*for(int i=0;i<k;i++) { potegi_max[i]=potegi[i]; }*/ } } //printf("%lld\n",liczba_teraz); potegi[k-1]+=1; if(potegi[0]>gora[0]) break; //printf("%d\n",potegi[k-1]); if(potegi[k-1]>gora[k-1]) { //printf("%d>%d\n",potegi[k-1],gora[k-1]); potegi[k-1]=0; potegi[k-2]+=1; for(int i=k-2;i>0;i--) { if(potegi[i]>gora[i]) { potegi[i-1]+=1; potegi[i]=0; }else{ break; } } } } printf("%llu\n",maximum); /*for(int i=0;i<k;i++) { printf("%d ",pierwsze[i]); } printf("\n"); for(int i=0;i<k;i++) { printf("%d ",potegi_max[i]); }*/ } return 0; } |