Problem:
Score : 300 points

Problem Statement

You are given four integers A, B, C, and D. Find the number of integers between A and B (inclusive) that can be evenly divided by neither C nor D.

Constraints

1\leq A\leq B\leq 10^{18}

1\leq C,D\leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

A B C D

Output

Print the number of integers between A and B (inclusive) that can be evenly divided by neither C nor D.

Sample Input 1

4 9 2 3

Sample Output 1

2

5 and 7 satisfy the condition.

Sample Input 2

10 40 6 8

Sample Output 2

23

Sample Input 3

314159265358979323 846264338327950288 419716939 937510582

Sample Output 3

532105071133627368

Solution in C++14 (Clang 3.8.0) (judge verdict: Accepted)

#include <iostream>
#include <sstream>
#include <stdio.h>
#include <cstring>
#include<vector>
#include <list>
#include<climits>
#include<algorithm>
#include<bitset>
#include<cmath>
#include<functional>
#include <numeric>
#include <map>
#include <tuple>
#include <string>
#define FORi(N) for(int i=0;i<N;++i)
#define FORj(N) for(int j=0;j<N;++j)
#define FORk(N) for(int k=0;k<N;++k)
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
ll gcd(ll m,ll n){
  if(n==0)return abs(m);
  return(gcd(n,m%n));
}
void putYN(bool b){
  if(b){
    cout<<"Yes"<<endl;
  }else{
    cout<<"No"<<endl;
  }
}
void swap(ll &a,ll &b){
  ll tmp=a;
  a=b;
  b=tmp;
}
int main(){
  ll A,B,C,D;
  cin>>A>>B>>C>>D;
  ll CD=C*D;
  /*if(A==B&&A%C!=0&&A%D!=0){
    cout<<1<<endl;
    return 0;
  }
  if(A==B){
    cout<<0<<endl;
    return 0;
  }*/
  A-=1;
  //B-=1;
  ll lowA=(A/CD)*CD;
  ll lowB=(B/CD)*CD;
  ll B_A = B-A;
  ll sum =B_A;
  sum -= B/C+B/D-B/(CD/gcd(C,D));
  sum += A/C+A/D-A/(CD/gcd(C,D));
  
  //if(B_A%CD==0)sum+=1;
  //if(B%CD==0)sum++;
  //if(lowA!=A)
  //sum -= (A-lowA+1)/C+(A-lowA+1)/D;
  //if(upB!=B)
  //sum += (B-lowB+1)/C+(B-lowB+1)/D;
  //else sum-=1;
  //if(lowA==A)sum+=1;
  //if(upB==B)sum+=1;
  cout<<sum<<endl;
  return 0;
  
}