#include <iostream>
#include <sstream>
#include <vector>
#include <numeric>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <iomanip>
#include <cstdlib>
#include <climits>
#include <set>
using namespace std;

//関数getinputdata宣言
vector<vector<string>> getinputdata();
vector<vector<int>> getinputdata2();
vector<vector<double>> getinputdata3();
vector<vector<long>> getinputdata4();

int gcd(int m, int n) {
    int temp;
    while (m % n != 0) {
        temp = n;
        n = m % n;
        m = temp;
    }
    return n;
}

void abc131_c(vector<vector<long>> v) {

    long long  a = v[0][0];
    long long  b = v[0][1];
    long long  c = v[0][2];
    long long  d = v[0][3];

    long long  lcm = (c * d) / gcd(c, d);

    long long  num1 = (a-1) / c;
    long long  num2 = (a-1) / d;
    long long  num3 = b / c;
    long long  num4 = b / d;

    long long  temp1 = (a-1) / lcm;
    long long  temp2 =b / lcm;

    long long  cnt = b - a + 1;
//
//    cout << "num1="<<num1<<endl;
//    cout << "num2="<<num2<<endl;
//    cout << "num3="<<num3<<endl;
//    cout << "num4="<<num4<<endl;
//    cout << temp1<<endl;
//    cout << temp2<<endl;
//    cout << "lcm=" << lcm <<endl;
    
//    cout << "cnt =" <<cnt<<endl;
    
//    2 4 6 8 3 6 9 - 2 4 6 8 3 9
//    cout << (num3+num4-temp2) <<endl;
    
    cout << cnt - ((num3+num4-temp2)-(num1+num2-temp1))  <<endl;
            



}

int main() {

    //    vector<vector < string>> vec_arr_result;
    vector<vector<long>> vec_arr_result;
    vec_arr_result = getinputdata4();

    abc131_c(vec_arr_result);

    return 0;
}


//関数getinputdata実装

vector<vector<long>> getinputdata4() {

    string str;
    string ret;
    stringstream ss;
    vector<string> v1;
    vector<vector<long>> vec_arr;

    //標準入力から入力がある間ループ処理でvector配列にデータ格納
    while (getline(cin, str)) {

        v1.push_back(str);

    }

    //stringstreamを利用してvector配列v1をスペースで分解処理
    for (string s : v1) {

        vector<long> array_data;
        ss << s;

        while (!ss.eof()) {

            ss >> ret;

            array_data.push_back(atol(ret.c_str()));
        }

        //vector配列に追加
        vec_arr.push_back(array_data);

        //バッファクリア
        ss.str("");
        //ストリームクリア
        ss.clear(stringstream::goodbit);

    }

    return vec_arr;


}

vector<vector<double>> getinputdata3() {

    string str;
    string ret;
    stringstream ss;
    vector<string> v1;
    vector<vector<double>> vec_arr;

    //標準入力から入力がある間ループ処理でvector配列にデータ格納
    while (getline(cin, str)) {

        v1.push_back(str);

    }

    //stringstreamを利用してvector配列v1をスペースで分解処理
    for (string s : v1) {

        vector<double> array_data;
        ss << s;

        while (!ss.eof()) {

            ss >> ret;

            array_data.push_back(atof(ret.c_str()));
        }

        //vector配列に追加
        vec_arr.push_back(array_data);

        //バッファクリア
        ss.str("");
        //ストリームクリア
        ss.clear(stringstream::goodbit);

    }

    return vec_arr;
}

//関数getinputdata実装

vector<vector<int>> getinputdata2() {

    string str;
    string ret;
    stringstream ss;
    vector<string> v1;
    vector<vector<int>> vec_arr;

    //標準入力から入力がある間ループ処理でvector配列にデータ格納
    while (getline(cin, str)) {

        v1.push_back(str);

    }

    //stringstreamを利用してvector配列v1をスペースで分解処理
    for (string s : v1) {

        vector<int> array_data;
        ss << s;

        while (!ss.eof()) {

            ss >> ret;

            array_data.push_back(atoi(ret.c_str()));
        }

        //vector配列に追加
        vec_arr.push_back(array_data);

        //バッファクリア
        ss.str("");
        //ストリームクリア
        ss.clear(stringstream::goodbit);

    }

    return vec_arr;


}

//関数getinputdata実装

vector<vector < string >> getinputdata() {

    string str;
    string ret;
    stringstream ss;
    vector<string> v1;
    vector<vector < string>> vec_arr;

    //標準入力から入力がある間ループ処理でvector配列にデータ格納
    while (getline(cin, str)) {

        v1.push_back(str);

    }

    //stringstreamを利用してvector配列v1をスペースで分解処理
    for (string s : v1) {

        vector<string> array_data;
        ss << s;

        while (!ss.eof()) {

            ss >> ret;

            array_data.push_back(ret);
        }

        //vector配列に追加
        vec_arr.push_back(array_data);

        //バッファクリア
        ss.str("");
        //ストリームクリア
        ss.clear(stringstream::goodbit);

    }

    return vec_arr;

}


Measured memory_bytes: 256