#include <bits/stdc++.h>
#define ll long long
using namespace std;

int main()
{
    ll X, Y, ans = 0;
    ll A, B;
    cin >> X >> Y >> A >> B;

    while ((double)X*A<=2e18 && X*A<Y && X*A<= X+B)
    {
            X *= A;
            ans++;
    }

    ans += (Y - X - 1) / B;

    cout << ans << endl;
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template<class T> using oset=tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define pb push_back
#define N 200001
#define ll long long
#define int ll 
#define pi pair<int , int>
#define pip pair<pair ,int>
#define mp make_pair 
#define f first
#define s second
#define mod 998244353
ll Mod(ll x, ll y, int p) 
{ll res = 1; x = x % p;
while (y > 0) 
{if(y & 1) res = (res*x) % p; 
y = y>>1;x = (x*x) % p; 
}return res; 
}
int* getlps(string pattern){
 int len = pattern.length();
 int * lps = new int[len];
 lps[0] = 0;
 int i = 1 , j = 0;
 while(i < len){
  if(pattern[i] == pattern[j]){
	  lps[i] = j+1;
   i++;
   j++;
  }
  else{
		if(j != 0){
		 j = lps[j-1];
		}
		else{
		 lps[i] = 0;
		 i++;
		}
  }
 }
 return lps;
}
class Triplet{
 public:
 int x ;
 int y ;
 int gcd;
};
Triplet extendedEuclid(int a , int b){
 if(b == 0){Triplet ans; ans.gcd = a;ans.x = 1;ans.y = 0;return ans;}
 Triplet smallAns = extendedEuclid(b , a%b);
 Triplet ans;
 ans.gcd = smallAns.gcd;
 ans.x = smallAns.y;
 ans.y = smallAns.x - (a/b)*smallAns.y;
 return ans;
}
int mmInverse(int a , int m){
 Triplet ans = extendedEuclid(a , m);
 return (ans.x+m)%m;
}
int fact[N];
void calfac(int n ){
fact[0] = 1;
for(int i = 1 ; i <= n+2; i++){
 fact[i] = (((fact[i-1]%mod)*(i%mod))%mod + mod)%mod;
}
 }
int calc(int n , int r){
 if(r > n)return 0;
 if(r == n)return 1;
 int ans = 1;
 ans = ((ans%mod)*(fact[n])%mod + mod)%mod;
 ans = ((ans%mod)*(mmInverse(fact[n-r] , mod)%mod) + mod)%mod;
 ans = ((ans%mod)*(mmInverse(fact[r] , mod)%mod) + mod)%mod;
 return (ans+mod)%mod;
}
void solve(int cntt){
int x , y , a , b;
cin>>x>>y>>a>>b;
int l = (y-1)/x;
int val = 1;
int cnt = 0;
int ans = 0 ;
for(int i = 0 ; i < 50 ; i++){
	  if(val*a < l){
	  	  cnt++;
	  	  val = val*a;
	  	  ans = max(cnt + max(0LL , (y-1-x*val)/b), ans);
	  }
	  else if(val*a == l){
	  	 cnt++;
	  	 val = val*a;
	  	 ans = max(cnt + max(0LL,  (y-1-x*val)/b), ans);
	  	 break;
	  }
}

cout<<max({ans , cnt ,(y-1-x)/b})<<endl;
}
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
t = 1;
int l = 0;
while(t--){
	l++;
solve(l);
}
return 0;
}
