#include<bits/stdc++.h>
// #define maxn 100010
// #define mod 998244353
using namespace std;
int read()
{
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	return s*w;
}
// int n;
// int A,B;
// int a[maxn]
// int ksm(int x,int y)
// {
	// int r=1;
	// while(y)
	// {
		// if(y&1) r=1ll*r*x%mod;
		// y>>=1,x=1ll*x*x%mod;
	// }
	// return r;
// }
signed main()
{
	int V=read(),T=read(),S=read(),D=read();
	if(T*V<=D&&D<=S*V) cout<<"No\n";
	else cout<<"Yes\n";
	return 0;
}
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<bitset>
#include<queue>
#include<stack>
#include<utility>
#include<cstdlib>
#include<cstdio>
#include<map>
using namespace std;

typedef long long ll;
typedef long double ld;

typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vector<int>> vvi;
typedef vector<vector<ll>> vvl;

typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;

struct Edge{
    int to, cost;
    Edge(int t, int c) : to(t), cost(c) { }
};
using Graph = vector<vector<Edge>>;

#define FOR(i, a, b) for(int i=(a); i<(b); ++i)
#define REP(i, n) FOR(i, 0, n)
#define NREP(i, n) FOR(i, 1, n+1)

template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

struct UnionFind {
    vector<int> par; // par[i]:iの親の番号　(例) par[3] = 2 : 3の親が2
	vector<int> siz; // 素集合のサイズを表す配列(1 で初期化)

    UnionFind(int N) : par(N), siz(N, 1) { //最初は全てが根であるとして初期化
        for(int i = 0; i < N; i++) par[i] = i;
    }

    int root(int x) { // データxが属する木の根を再帰で得る：root(x) = {xの木の根}
        if (par[x] == x) return x;
        return par[x] = root(par[x]);
    }

    void unite(int x, int y) { // xとyの木を併合
        int rx = root(x); //xの根をrx
        int ry = root(y); //yの根をry
        if (rx == ry) return; //xとyの根が同じ(=同じ木にある)時はそのまま
		// merge technique（データ構造をマージするテク．小を大にくっつける）
		if(siz[rx] < siz[ry]) swap(rx,ry);
		siz[rx] += siz[ry];
        par[ry] = rx; //xとyの根が同じでない(=同じ木にない)時：yの根ryをxの根rxにつける
		return;
    }

    bool same(int x, int y) { // 2つのデータx, yが属する木が同じならtrueを返す
        int rx = root(x);
        int ry = root(y);
        return rx == ry;
    }
	
	int size(int x){	//素集合のサイズ
		return siz[root(x)];
	}
	
};

int uf_num(UnionFind uf, int N){
	int res=0;
	REP(i,N) if(uf.root(i)==i) res++;
	return res;
}


const int INF=2e9+1;	//for some test case (near inf)
const ll INFLL=1e18;
const ll MOD=1e9+7;

ll MODpow(ll x, ll n, ll mod){
	ll res=1;
	while(n>0){
		if(n&1) res=res*x%mod;
		x=x*x%mod;
		n >>= 1;
	}
	return res;
}

ll MODcomb(ll n, ll r, ll mod, vl fact){
	ll res=1;
	if(n>=r){
		res=fact[n]%mod;
		res=res*MODpow(fact[r], mod-2, mod)%mod;
		res=res*MODpow(fact[n-r], mod-2, mod)%mod;
	}
	return res;
}

ll gcd(ll a, ll b){
	if(a%b==0) return b;
	else return gcd(b,a%b);
}

ll lcm(ll a, ll b){
	return a/gcd(a,b)*b;
}


int main(void){
	int v,t,s,d;
	cin >> v >> t >> s >>d;
	if(v*t<=d && d<=v*s) cout << "No" << endl;
	else cout << "Yes" << endl;
	
	
	
	return 0;
}
