#include <bits/stdc++.h>
using namespace std;
const long long N = 100005;
long long n, w, x[N], v[N], tot = 0;
struct plane {
  double MIN, MAX;
  long long d;
  bool operator<(const plane &rhs) const {
    return (MIN != rhs.MIN ? MIN > rhs.MIN : MAX < rhs.MAX);
  }
} p[N];
double ar[N];
void init() {
  scanf("%lld%lld", &n, &w);
  for (long long i = 1; i <= n; ++i) {
    scanf("%lld%lld", &x[i], &v[i]);
  }
}
long long tree[N];
long long lowbit(long long x) { return x & (-x); }
void update(long long x, long long num) {
  for (long long i = x; i <= n; i += lowbit(i)) {
    tree[i] += num;
  }
}
long long query(long long x) {
  long long ans = 0;
  for (long long i = x; i > 0; i -= lowbit(i)) {
    ans += tree[i];
  }
  return ans;
}
void solve() {
  for (long long i = 1; i <= n; ++i) {
    p[i].MIN = -x[i] * 1.0 / (v[i] + w);
    p[i].MAX = -x[i] * 1.0 / (v[i] - w);
  }
  sort(p + 1, p + n + 1);
  for (long long i = 1; i <= n; ++i) {
    ar[++tot] = p[i].MAX;
  }
  sort(ar + 1, ar + n + 1);
  for (long long i = 1; i <= n; ++i) {
    p[i].d = lower_bound(ar + 1, ar + n + 1, p[i].MAX) - ar;
  }
  long long ans = 0;
  for (long long i = 1; i <= n; ++i) {
    ans += query(p[i].d);
    update(p[i].d, 1);
  }
  printf("%lld\n", ans);
}
int main() {
  init();
  solve();
  return 0;
}
