#include <bits/stdc++.h>
using namespace std;
int n;
struct node {
  int sum = 0;
};
vector<node> tree;
void increment(int i) {
  i += n;
  ++tree[i].sum;
  for (i /= 2; i > 0; i /= 2)
    tree[i].sum = tree[2 * i].sum + tree[2 * i + 1].sum;
}
int get_res(int l, int r) {
  l += n;
  r += n;
  int res = 0;
  while (l <= r) {
    if (l % 2 == 1) res += tree[l].sum, ++l;
    if (r % 2 == 0) res += tree[r].sum, --r;
    l /= 2, r /= 2;
  }
  return res;
}
bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
  return make_pair(a.first, -a.second) < make_pair(b.first, -b.second);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int w;
  cin >> n >> w;
  vector<pair<long double, int>> left, right;
  for (int i = 0; i < n; ++i) {
    int x, v;
    cin >> x >> v;
    long double lw = static_cast<long double>(v - w) / x;
    long double rw = static_cast<long double>(v + w) / x;
    left.emplace_back(lw, i);
    right.emplace_back(rw, i);
  }
  sort(left.begin(), left.end());
  sort(right.begin(), right.end());
  vector<pair<int, int>> pts(n);
  vector<pair<int, int>> color(n, {0, 0});
  for (int i = 0; i < n; ++i) {
    if (i > 0) color[i] = color[i - 1];
    if (i > 0 && left[i].first != left[i - 1].first) {
      ++color[i].first;
    }
    if (i > 0 && right[i].first != right[i - 1].first) {
      ++color[i].second;
    }
    pts[left[i].second].first = color[i].first;
    pts[right[i].second].second = color[i].second;
  }
  sort(pts.begin(), pts.end(), cmp);
  tree.resize(2 * n);
  long long ans = 0;
  for (int i = n - 1; i >= 0; --i) {
    ans += get_res(0, pts[i].second);
    increment(pts[i].second);
  }
  cout << ans << "\n";
  return 0;
}
