#include #include using namespace std ; long long digsa[64], digsb[64] ; void filldigs(long long *a, long long p) { a[0] = 1 ; for (int i=1; ; i++) if (a[i-1] >= LLONG_MAX / p) { a[i] = LLONG_MAX ; break ; } else { a[i] = a[i-1] * p ; } } long long recur(int dpa, int dpb, int sa, int sb, int a, int b, long long na, long long nb, long long *digsa, long long *digsb) { if (na == 0 && nb == 0) { if (sa == sb) return 0 ; else return 1 ; } if (dpa == 0 || (dpb > 0 && digsa[dpa] - na < digsb[dpb] - nb)) { swap(dpa, dpb) ; swap(sa, sb) ; swap(a, b) ; swap(na, nb) ; swap(digsa, digsb) ; } dpa-- ; long long dig = na / digsa[dpa] ; sa += dig ; na -= dig * digsa[dpa] ; if (sa + dpa * (a - 1) < sb || sb + dpb * (b - 1) < sa) return min(digsa[dpa]-na, digsb[dpb]-nb) ; // tail recursion return recur(dpa, dpb, sa, sb, a, b, na, nb, digsa, digsb) ; } void showt(long long n, int b) { if (n < b && n < 10) cout << n ; else if (n < b) cout << (char)('A' + (n-10)) ; else { showt(n/b, b) ; showt(n % b, b) ; } } int main(int argc, char *[]) { long long a, b, n ; cin >> n >> a >> b ; n++ ; filldigs(digsa, a) ; filldigs(digsb, b) ; int dpa = 1 ; int dpb = 1 ; int loops = 1 ; while (1) { while (n >= digsa[dpa]) dpa++ ; while (n >= digsb[dpb]) dpb++ ; long long inc = recur(dpa, dpb, 0, 0, a, b, n, n, digsa, digsb) ; if (inc == 0) break ; n += inc ; loops++ ; } cout << n << endl;//<< " " ; //showt(n, a) ; //cout << " " ; //showt(n, b) ; //if (argc > 1) //cout << " " << loops ; //cout << endl ; }