#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int ma[maxn << 2];
int query(int ll, int rr, int l, int r, int rt) {
  if (ll <= l && r <= rr) return ma[rt];
  int m = (l + r) >> 1, res = -1;
  if (ll <= m) res = max(res, query(ll, rr, l, m, rt << 1));
  if (rr > m) res = max(res, query(ll, rr, m + 1, r, rt << 1 | 1));
  return res;
}
void modify(int p, int v, int l, int r, int rt) {
  if (l == r) {
    ma[rt] = max(ma[rt], v);
    return;
  }
  int m = (l + r) >> 1;
  if (p <= m)
    modify(p, v, l, m, rt << 1);
  else
    modify(p, v, m + 1, r, rt << 1 | 1);
  ma[rt] = max(ma[rt << 1], ma[rt << 1 | 1]);
}
int n;
struct event {
  long long v1, v2;
  bool operator<(const event& a) const {
    if (v2 != a.v2) return v2 < a.v2;
    return v1 < a.v1;
  }
} ji[maxn];
map<long long, int> mp;
map<long long, int>::iterator it;
int main() {
  int n, v;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    cin >> ji[i].v1 >> ji[i].v2;
  }
  scanf("%d", &v);
  long long a, b;
  for (int i = 1; i <= n; i++) {
    a = ji[i].v1 + ji[i].v2 * v, b = -ji[i].v1 + ji[i].v2 * v;
    mp[a];
    ji[i].v1 = a;
    ji[i].v2 = b;
  }
  mp[0];
  sort(ji + 1, ji + n + 1);
  int tot = 0, ans1 = 0, ans2 = 0;
  for (it = mp.begin(); it != mp.end(); it++) it->second = ++tot;
  for (int i = 1; i <= n; i++) ji[i].v1 = mp[ji[i].v1];
  memset(ma, -1, sizeof(ma));
  int pt = n + 1;
  for (int i = 1; i <= n; i++) {
    if (ji[i].v2 >= 0) {
      pt = i;
      break;
    }
  }
  modify(mp[0], 0, 1, tot, 1);
  for (int i = pt; i <= n; i++) {
    int tp = query(1, ji[i].v1, 1, tot, 1);
    if (tp != -1) {
      ans1 = max(ans1, tp + 1);
      modify(ji[i].v1, tp + 1, 1, tot, 1);
    }
  }
  memset(ma, 0, sizeof(ma));
  for (int i = 1; i <= n; i++) {
    int tp = query(1, ji[i].v1, 1, tot, 1);
    ans2 = max(ans2, tp + 1);
    modify(ji[i].v1, tp + 1, 1, tot, 1);
  }
  printf("%d %d\n", ans1, ans2);
}
