#include <bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
using std::make_pair;
using std::pair;
using std::sort;
using std::swap;
namespace BasicUnit {
inline int readint() {
  int a = 0, po = 1;
  char ch = getchar();
  while (isspace(ch)) ch = getchar();
  if (ch == '-') po = -1, ch = getchar();
  while (isdigit(ch)) a = a * 10 + ch - '0', ch = getchar();
  return a * po;
}
inline long long readLL() {
  long long a = 0, po = 1;
  char ch = getchar();
  while (isspace(ch)) ch = getchar();
  if (ch == '-') po = -1, ch = getchar();
  while (isdigit(ch)) a = a * 10 + ch - '0', ch = getchar();
  return a * po;
}
template <typename T>
inline T min(T a, T b) {
  return a < b ? a : b;
}
template <typename T>
inline T max(T a, T b) {
  return a > b ? a : b;
}
}  // namespace BasicUnit
using namespace BasicUnit;
struct Fraction {
 private:
  long long num, den;
  static long long gcd(long long a, long long b) {
    return !b ? a : gcd(b, a % b);
  }
  friend Fraction inv(const Fraction x);

 public:
  Fraction(long long x = 1) : num(x), den(1) {}
  Fraction(long long num, long long den) {
    long long g = gcd(num, den);
    this->num = num / g;
    this->den = den / g;
    if (this->den < 0) this->num = -this->num, this->den = -this->den;
  }
  Fraction operator+(Fraction b) const {
    long long nd = (*this).den / gcd((*this).den, b.den) * b.den;
    long long nn = (*this).num * (nd / (*this).den) + b.num * (nd / b.den);
    long long g = gcd(nd, nn);
    return Fraction(nn / g, nd / g);
  }
  Fraction operator*(Fraction b) const {
    long long gx = gcd((*this).num, b.den);
    long long gy = gcd((*this).den, b.num);
    return Fraction((*this).num / gx * (b.num / gy),
                    (*this).den / gy * (b.den / gx));
  }
  Fraction operator/(Fraction b) const { return (*this) * inv(b); }
  bool operator<(Fraction b) const {
    return (*this).num * b.den < b.num * (*this).den;
  }
  bool operator==(Fraction b) const { return !((*this) < b) && !(b < (*this)); }
  bool operator>(Fraction b) const { return b < (*this); }
  void print() const {
    printf("(%lld / %lld = %.5lf)", num, den, (double)num / den);
  }
  void println() const {
    print();
    printf("\n");
  }
};
Fraction inv(const Fraction x) {
  return x.den < 0 ? Fraction(-x.den, -x.num) : Fraction(x.den, x.num);
}
template <int maxN>
struct FenwickTree {
  int n, C[maxN];
  void Init(int n) { this->n = n; }
  int Sum(int x) {
    int ret = 0;
    for (int i = x; i > 0; i -= (i & -i)) ret += C[i];
    return ret;
  }
  void Modify(int x, int d) {
    for (int i = x; i <= n; i += (i & -i)) C[i] += d;
  }
};
const int maxN = 100000 + 233;
int n;
long long w, x[maxN], v[maxN];
Fraction p[maxN], q[maxN];
Fraction seq[maxN << 1];
int len = 0;
pair<int, int> a[maxN];
FenwickTree<maxN << 1> fwt;
int t[maxN], tl;
int main() {
  n = readint();
  w = readLL();
  for (int i = 1; i <= n; i++) {
    x[i] = readLL();
    v[i] = readLL();
    p[i] = Fraction(-x[i], v[i] + w);
    q[i] = Fraction(-x[i], v[i] - w);
    seq[++len] = p[i];
    seq[++len] = q[i];
  }
  std::sort(seq + 1, seq + len + 1);
  len = std::unique(seq + 1, seq + len + 1) - seq - 1;
  for (int i = 1; i <= n; i++) {
    int x = std::lower_bound(seq + 1, seq + len + 1, p[i]) - seq;
    int y = std::lower_bound(seq + 1, seq + len + 1, q[i]) - seq;
    a[i] = make_pair(x, y);
  }
  std::sort(a + 1, a + 1 + n);
  fwt.Init(n * 2);
  tl = 0;
  int pre = -233;
  long long cnt = 0, smc = 0;
  for (int i = n; i > 0; i--) {
    if (a[i].first != pre) {
      for (int j = 0; j < tl; j++) fwt.Modify(t[j], 1);
      tl = 0;
      cnt += smc * (smc - 1) / 2;
      smc = 0;
      pre = a[i].first;
    }
    ++smc;
    cnt += fwt.Sum(a[i].second);
    t[tl++] = a[i].second;
  }
  cnt += smc * (smc - 1) / 2;
  cout << cnt << endl;
  return 0;
}
