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 (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>
typedef long long ll;
typedef long l;

int main(void){
  // ll i;
  ll ans;
  ll c_c, d_c, cd_c;//c,d,cdの最小公倍数の倍数
  ll count;//cまたはdの倍数
  ll a, b;
  l c, d;
  ll cd;//ｃｄの最小公倍数
  ll r;//あまり
  l t;

  scanf("%lld %lld %ld %ld", &a,&b,&c,&d);

  cd=c*d;

  //cの倍数
  r=a%c;
  c_c=((b-a)+r)/c;
  if(r==0) c_c++;
  r=a%d;
  d_c=((b-a)+r)/d;
  if(r==0) d_c++;

  // for(i=max2(c, d); i<=c*d; i++){
  //   if(i%c==0 && i%d==0){
  //     cd=i;
  //     break;
  //   }
  // }
  if(c<d){
    t=d;
    d=c;
    c=t;
  }

  t=c%d;
  while(t!=0){
    c=d;
    d=t;
    t=c%d;
  }

  cd=cd/d;
  //cdの個数
  r=a%cd;
  cd_c=((b-a)+r)/cd;
  if(r==0) cd_c++;


  // printf("c=%lld d=%lld cd=%lld\n", c_c, d_c, cd_c);
  count=c_c+d_c-cd_c;
  ans=(b-a+1)-count;

  printf("%lld\n", ans);

  return 0;
}