#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long lcm(long long a, long long b) { return (a * b) / gcd(a, b); }
int main() {
  long long l, r, x, y, x0, y0;
  cin >> l >> r >> x >> y;
  x0 = x, y0 = y;
  map<long long, long long> factores;
  for (int i = 2; i * i <= x; i++) {
    while (x && x % i == 0) {
      factores[i]++;
      x /= i;
    }
  }
  if (x > 1) factores[x]++;
  for (int i = 2; i * i <= y; i++) {
    while (y && y % i == 0) {
      factores[i]++;
      y /= i;
    }
  }
  if (y > 1) factores[y]++;
  vector<long long> divisores;
  divisores.push_back(1);
  for (auto f : factores) {
    long long factor = f.first;
    int grado = f.second;
    int lim = divisores.size();
    long long pot = 1;
    for (int i = 0; i < grado; i++) {
      pot *= factor;
      for (int j = 0; j < lim; j++) {
        divisores.push_back(divisores[j] * pot);
      }
    }
  }
  sort(divisores.begin(), divisores.end());
  int cant = 0;
  int tam = divisores.size();
  for (int i = 0; i < tam; i++) {
    if (gcd(divisores[i], divisores[tam - 1 - i]) == x0) {
      if (lcm(divisores[i], divisores[tam - 1 - i]) == y0) {
        if (l <= divisores[i] && divisores[i] <= r) {
          if (l <= divisores[tam - 1 - i] && divisores[tam - 1 - i] <= r) {
            cant++;
          }
        }
      }
    }
  }
  cout << cant << endl;
  return 0;
}
