#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5 + 10;
int N, W;
int gcd(int a, int b) {
  while (b) {
    int r = a % b;
    a = b;
    b = r;
  }
  return a;
}
struct Fraction {
  int x, y;
  Fraction() {}
  Fraction(int x, int y) {
    int xyGcd = gcd(x, y);
    this->x = x / xyGcd;
    this->y = y / xyGcd;
  }
  bool operator<(const Fraction &rhs) const {
    return 1ll * x * rhs.y < 1ll * rhs.x * y;
  }
  bool operator>(const Fraction &rhs) const {
    return 1ll * x * rhs.y > 1ll * rhs.x * y;
  }
  bool operator==(const Fraction &rhs) const {
    return x == rhs.x && y == rhs.y;
  }
};
pair<Fraction, int> start[NMAX], finish[NMAX];
int posS[NMAX], posF[NMAX];
int BIT[NMAX];
int where[NMAX];
void updateBit(int pos, int value) {
  for (; pos <= N; pos += pos & (-pos)) BIT[pos] += value;
}
int queryBit(int pos) {
  int answer = 0;
  for (; pos >= 1; pos -= pos & (-pos)) answer += BIT[pos];
  return answer;
}
int main() {
  scanf("%d %d", &N, &W);
  for (int i = 1; i <= N; ++i) {
    int x, v;
    scanf("%d %d", &x, &v);
    start[i] = {Fraction(abs(x), abs(v - W)), i};
    finish[i] = {Fraction(abs(x), abs(v + W)), i};
  }
  for (int i = 1; i <= N; ++i) posS[i] = posF[i] = i;
  sort(posS + 1, posS + N + 1,
       [](const int &lhs, const int &rhs) { return start[lhs] < start[rhs]; });
  for (int i = 1; i <= N; ++i) where[posS[i]] = i;
  sort(posF + 1, posF + N + 1, [](const int &lhs, const int &rhs) {
    return finish[lhs].first == finish[rhs].first
               ? where[lhs] < where[rhs]
               : finish[lhs].first > finish[rhs].first;
  });
  for (int i = 1; i <= N; ++i) where[posF[i]] = i;
  sort(posS + 1, posS + N + 1, [](const int &lhs, const int &rhs) {
    return start[lhs].first == start[rhs].first
               ? where[lhs] < where[rhs]
               : start[lhs].first < start[rhs].first;
  });
  int64_t answer = 0;
  for (int i = 1; i <= N; ++i) {
    answer += queryBit(where[posS[i]] - 1);
    updateBit(where[posS[i]], 1);
  }
  cout << answer << '\n';
  return 0;
}
