#include<iostream>
#include<algorithm>
#include<queue>
#include<list>
#include<stdio.h>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define ull long long int
#define FOR(i,n) for(int i=0;i<n;++i)
#define FORD(i,n) for(int i=(n)-1;i>=0;--i)
#define znakow 26
#define dcout 0 && cout
#define INF 9999999
int inline min(int a,int b){return a>b?b:a;}
int inline max(int a,int b){return a<b?b:a;}
int NIL=0;
ull maxi(ull* primes, ull*offsets, ull limit, ull offset, ull multiplier) {
if (*offsets < offset) return 1;
if (!*primes) return 1;
ull prime = *primes;
//if (limit < prime) return 1;
ull primeN = 1;
ull mx = 0;
while (limit / primeN > 0) {
ull c = maxi(primes+1, offsets + 1, limit / primeN, (limit % primeN) * multiplier + offset,
multiplier * primeN) * primeN;
if (c > mx) mx = c;
primeN *= prime;
}
ull bestOffset = offset + (limit - mx) * multiplier;
if (bestOffset < *offsets)
*offsets = bestOffset;
return mx;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ull *offsets = new ull[110];
FOR(i,110)offsets[i]=1000000000000000001LL;
int n;
ull k;
cin>>n>>k;
ull*primes = new ull[n+7];
FOR(i,n)cin>>primes[i];
sort(primes,primes+n);
reverse(primes,primes+n);
primes[n]=0;
cout<<maxi(primes, offsets, k, 0, 1)<<endl;
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 | #include<iostream> #include<algorithm> #include<queue> #include<list> #include<stdio.h> #include<vector> #include<map> #include<set> using namespace std; #define ull long long int #define FOR(i,n) for(int i=0;i<n;++i) #define FORD(i,n) for(int i=(n)-1;i>=0;--i) #define znakow 26 #define dcout 0 && cout #define INF 9999999 int inline min(int a,int b){return a>b?b:a;} int inline max(int a,int b){return a<b?b:a;} int NIL=0; ull maxi(ull* primes, ull*offsets, ull limit, ull offset, ull multiplier) { if (*offsets < offset) return 1; if (!*primes) return 1; ull prime = *primes; //if (limit < prime) return 1; ull primeN = 1; ull mx = 0; while (limit / primeN > 0) { ull c = maxi(primes+1, offsets + 1, limit / primeN, (limit % primeN) * multiplier + offset, multiplier * primeN) * primeN; if (c > mx) mx = c; primeN *= prime; } ull bestOffset = offset + (limit - mx) * multiplier; if (bestOffset < *offsets) *offsets = bestOffset; return mx; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); ull *offsets = new ull[110]; FOR(i,110)offsets[i]=1000000000000000001LL; int n; ull k; cin>>n>>k; ull*primes = new ull[n+7]; FOR(i,n)cin>>primes[i]; sort(primes,primes+n); reverse(primes,primes+n); primes[n]=0; cout<<maxi(primes, offsets, k, 0, 1)<<endl; return 0; } |
English