#include <bits/stdc++.h>
using namespace std;
struct node {
  int x;
  int y;
};
long long a1, b1, a2, b2, L, R, a, m;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long ex_gcd(long long a, long long b, long long &x, long long &y) {
  if (b == 0) {
    x = 1, y = 0;
    return a;
  }
  long long d = ex_gcd(b, a % b, y, x);
  y -= a / b * x;
  return d;
}
long long inverse(long long a, long long mod) {
  long long x, y;
  if (ex_gcd(a, mod, x, y) != 1) return -1;
  return (x % mod + mod) % mod;
}
bool Merge(long long a1, long long m1, long long a2, long long m2,
           long long &ansa, long long &ansm) {
  long long c = a2 - a1, d = gcd(m1, m2);
  if (c % d) return false;
  c = (c % m2 + m2) % m2;
  long long A = c / d * inverse(m1 / d, m2 / d);
  A %= m2 / d;
  long long tmp_a = m1 * A + a1;
  ansm = m1 / d * m2;
  ansa = (tmp_a % ansm + ansm) % ansm;
  return true;
}
int main() {
  while (~scanf("%lld%lld%lld%lld%lld%lld", &a1, &b1, &a2, &b2, &L, &R)) {
    if (!Merge(b1, a1, b2, a2, a, m)) {
      printf("0\n");
      continue;
    }
    L = max(max(b1, b2), L);
    if (L > R) {
      printf("0\n");
      continue;
    } else {
      if ((L - a) % m == 0)
        ;
      else {
        if (L - a > 0)
          L = ((L - a) / m + 1) * m + a;
        else
          L = ((L - a) / m) * m + a;
      }
      if (L > R)
        printf("0\n");
      else
        printf("%lld\n", (R - L) / m + 1);
    }
  }
  return 0;
}
