#include <bits/stdc++.h> //Andrei Alexandru a.k.a Sho10
#define ll long long
#define double long double
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#define all(a) (a).begin(), (a).end()
#define sz size
#define f first
#define s second
#define pb push_back
#define er erase
#define in insert
#define mp make_pair
#define pi pair
#define rc(s) return cout<<s,0
#define endl '\n'
#define mod 1000000007
#define PI 3.14159265359
#define MAXN 100005
#define INF 1000000005
#define LINF 1000000000000000005ll
#define CODE_START  ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
ll x,y,a,b,ans=0;
int32_t main(){
CODE_START;
cin>>x>>y;
cin>>a>>b;
while(x<b&&x*a<y){
    x*=a;
    ans++;
}
ans+=(y-1-x)/b;
cout<<ans<<endl;
}

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

// a + bi <=> a + bx
using P = complex<double>;

int main(){
    int n, m, k;
    cin >> n >> m >> k;
    vector<int> a(k);
    for(int i=0; i<k; ++i) cin >> a[i];
    // 「振出しに戻る」が M マス連続していないことを確認する
    int conti_cnt = 1;
    for(int i=0; i<k; ++i){
        if(i > 0 && a[i] - a[i-1] == 1){
            conti_cnt += 1;
        }else{
            conti_cnt = 1;
        }
        if(conti_cnt >= m){
            cout << -1 << endl;
            return 0;
        }
    }

    // 求める値（マス 0 からマス n に到達するために必要な回数の期待値）を X とする
    // dp[i] = {マス i からマス n に到達するために必要な回数の期待値}
    //       = 0                                 （ i>=n のとき）
    //         X                                 （マス i が「振出しに戻る」のとき）
    //         (dp[i+1] + ... + dp[i+m]) / m + 1 （それ以外）
    vector<P> dp(n+m+1, 0);
    for(int i=0; i<k; ++i){
        dp[a[i]] = P{0, 1};
    }
    P s{0, 0}; // 累積和
    for(int i=n-1; i>=0; --i){
        s += dp[i+1] - dp[i+m+1];
        if(dp[i].imag() == 0){
            dp[i] = s / double(m) + 1.0;
        }
    }
    // X = a + bX より X=a/(1-b)
    cout << setprecision(20) << dp[0].real() / (1 - dp[0].imag()) << endl;
    return 0;
}