#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1E9 + 7;
long long qmod(long long a, long long b, long long c) {
  long long res = 1;
  a %= c;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % c;
    a = a * a % c;
  }
  return res;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
template <typename T, typename S>
void upmax(T &a, S b) {
  if (a < b) a = b;
}
template <typename T, typename S>
void upmin(T &a, S b) {
  if (a > b) a = b;
}
template <typename T>
void W(T b) {
  cout << b << endl;
}
void gettle() {
  while (1)
    ;
}
void getre() {
  int t = 0;
  t /= t;
}
const int N = 1E5 + 7;
struct frac {
  int fz, fm;
  frac() {}
  frac(int _1, int _2) : fz(_1), fm(_2) {}
  bool operator==(const frac &p) const {
    return (long long)fz * p.fm == (long long)p.fz * fm;
  }
  bool operator<(const frac &p) const {
    return (long long)fz * p.fm < (long long)p.fz * fm;
  }
} b[N];
struct node {
  frac x, y;
  int pos;
  bool operator<(const node &p) const {
    return x == p.x ? pos > p.pos : x < p.x;
  }
} a[N];
int n, w, m;
int bit[N];
void add(int p, int d) {
  for (; p <= m; p += p & -p) bit[p] += d;
}
int ask(int p) {
  int s = 0;
  for (; p; p -= p & -p) s += bit[p];
  return s;
}
int main() {
  scanf("%d %d", &n, &w);
  for (int i = 1; i <= n; i++) {
    int x, v;
    scanf("%d %d", &x, &v);
    a[i].x = frac(abs(x), abs(v + w));
    a[i].y = frac(abs(x), abs(v - w));
    b[i] = a[i].y;
  }
  sort(b + 1, b + 1 + n);
  m = unique(b + 1, b + 1 + n) - (b + 1);
  for (int i = 1; i <= n; i++)
    a[i].pos = lower_bound(b + 1, b + 1 + m, a[i].y) - b;
  sort(a + 1, a + 1 + n);
  long long res = 0;
  for (int i = 1; i <= n; i++) {
    res += (i - 1 - ask(a[i].pos - 1));
    add(a[i].pos, 1);
  }
  printf("%lld\n", res);
  return 0;
}
