import java.util.*;

public class Main{
    public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);

      long A=sc.nextLong();
      long B=sc.nextLong();
      long C=sc.nextLong();
      long D=sc.nextLong();
      long cnt=0;

      long lcmCD;
      long numAC,numAD,numACD,numBC,numBD,numBCD;
      long ansA,ansB,ans;

      lcmCD=lcm(C,D);

      numAC=(A-1)/C;  //A未満でCの倍数の個数(切り捨てされる)
      numAD=(A-1)/D;  //A未満でDの倍数の個数(切り捨てされる)
      numACD=(A-1)/lcmCD;  //A未満でLCM(C,D)の倍数の個数(切り捨てされる)
      ansA=(A-1)-(numAC+numAD-numACD);  //A未満でC,D,LCMで割り切れない数

      numBC=B/C;  //B以下でCの倍数の個数(切り捨てされる)
      numBD=B/D;  //B以下でDの倍数の個数(切り捨てされる)
      numBCD=B/lcmCD;  //B以下でLCM(C,D)の倍数の個数(切り捨てされる)
      ansB=B-(numBC+numBD-numBCD);  //B以下でC,D,LCMで割り切れない数

      ans=ansB-ansA;

      System.out.println(ans);
    }

  public static long gcd(long i,long j){
    if(i<j){return gcd(j,i);} //大きい方をiとして再実行}
    if(i%j==0){return j;}
    else{return gcd(j,i%j);}
  }
  public static long lcm(long i,long j){
    return i*j/gcd(i,j);
  }

} import java.util.*; util.* java public class Main{
    public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);

      long A=sc.nextLong();
      long B=sc.nextLong();
      long C=sc.nextLong();
      long D=sc.nextLong();
      long cnt=0;

      long lcmCD;
      long numAC,numAD,numACD,numBC,numBD,numBCD;
      long ansA,ansB,ans;

      lcmCD=lcm(C,D);

      numAC=(A-1)/C;  //A未満でCの倍数の個数(切り捨てされる)
      numAD=(A-1)/D;  //A未満でDの倍数の個数(切り捨てされる)
      numACD=(A-1)/lcmCD;  //A未満でLCM(C,D)の倍数の個数(切り捨てされる)
      ansA=(A-1)-(numAC+numAD-numACD);  //A未満でC,D,LCMで割り切れない数

      numBC=B/C;  //B以下でCの倍数の個数(切り捨てされる)
      numBD=B/D;  //B以下でDの倍数の個数(切り捨てされる)
      numBCD=B/lcmCD;  //B以下でLCM(C,D)の倍数の個数(切り捨てされる)
      ansB=B-(numBC+numBD-numBCD);  //B以下でC,D,LCMで割り切れない数

      ans=ansB-ansA;

      System.out.println(ans);
    }

  public static long gcd(long i,long j){
    if(i<j){return gcd(j,i);} //大きい方をiとして再実行}
    if(i%j==0){return j;}
    else{return gcd(j,i%j);}
  }
  public static long lcm(long i,long j){
    return i*j/gcd(i,j);
  }

} Main public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);

      long A=sc.nextLong();
      long B=sc.nextLong();
      long C=sc.nextLong();
      long D=sc.nextLong();
      long cnt=0;

      long lcmCD;
      long numAC,numAD,numACD,numBC,numBD,numBCD;
      long ansA,ansB,ans;

      lcmCD=lcm(C,D);

      numAC=(A-1)/C;  //A未満でCの倍数の個数(切り捨てされる)
      numAD=(A-1)/D;  //A未満でDの倍数の個数(切り捨てされる)
      numACD=(A-1)/lcmCD;  //A未満でLCM(C,D)の倍数の個数(切り捨てされる)
      ansA=(A-1)-(numAC+numAD-numACD);  //A未満でC,D,LCMで割り切れない数

      numBC=B/C;  //B以下でCの倍数の個数(切り捨てされる)
      numBD=B/D;  //B以下でDの倍数の個数(切り捨てされる)
      numBCD=B/lcmCD;  //B以下でLCM(C,D)の倍数の個数(切り捨てされる)
      ansB=B-(numBC+numBD-numBCD);  //B以下でC,D,LCMで割り切れない数

      ans=ansB-ansA;

      System.out.println(ans);
    } main {
      Scanner sc = new Scanner(System.in);

      long A=sc.nextLong();
      long B=sc.nextLong();
      long C=sc.nextLong();
      long D=sc.nextLong();
      long cnt=0;

      long lcmCD;
      long numAC,numAD,numACD,numBC,numBD,numBCD;
      long ansA,ansB,ans;

      lcmCD=lcm(C,D);

      numAC=(A-1)/C;  //A未満でCの倍数の個数(切り捨てされる)
      numAD=(A-1)/D;  //A未満でDの倍数の個数(切り捨てされる)
      numACD=(A-1)/lcmCD;  //A未満でLCM(C,D)の倍数の個数(切り捨てされる)
      ansA=(A-1)-(numAC+numAD-numACD);  //A未満でC,D,LCMで割り切れない数

      numBC=B/C;  //B以下でCの倍数の個数(切り捨てされる)
      numBD=B/D;  //B以下でDの倍数の個数(切り捨てされる)
      numBCD=B/lcmCD;  //B以下でLCM(C,D)の倍数の個数(切り捨てされる)
      ansB=B-(numBC+numBD-numBCD);  //B以下でC,D,LCMで割り切れない数

      ans=ansB-ansA;

      System.out.println(ans);
    } Scanner sc = new Scanner(System.in); sc new Scanner(System.in) long A=sc.nextLong(); A sc.nextLong() sc.nextLong sc long B=sc.nextLong(); B sc.nextLong() sc.nextLong sc long C=sc.nextLong(); C sc.nextLong() sc.nextLong sc long D=sc.nextLong(); D sc.nextLong() sc.nextLong sc long cnt=0; cnt 0 long lcmCD; lcmCD long numAC numAC numAD numAD numACD numACD numBC numBC numBD numBD numBCD; numBCD long ansA ansA ansB ansB ans; ans lcmCD=lcm(C,D) lcmCD lcm(C,D) lcm C D numAC=(A-1)/C numAC (A-1)/C (A-1) A 1 C numAD=(A-1)/D numAD (A-1)/D (A-1) A 1 D numACD=(A-1)/lcmCD numACD (A-1)/lcmCD (A-1) A 1 lcmCD ansA=(A-1)-(numAC+numAD-numACD) ansA (A-1)-(numAC+numAD-numACD) (A-1) A 1 (numAC+numAD-numACD) numAC+numAD numAC numAD numACD numBC=B/C numBC B/C B C numBD=B/D numBD B/D B D numBCD=B/lcmCD numBCD B/lcmCD B lcmCD ansB=B-(numBC+numBD-numBCD) ansB B-(numBC+numBD-numBCD) B (numBC+numBD-numBCD) numBC+numBD numBC numBD numBCD ans=ansB-ansA ans ansB-ansA ansB ansA System.out.println(ans) System.out.println System.out System System.out ans String[] args args public static long gcd(long i,long j){
    if(i<j){return gcd(j,i);} //大きい方をiとして再実行}
    if(i%j==0){return j;}
    else{return gcd(j,i%j);}
  } gcd {
    if(i<j){return gcd(j,i);} //大きい方をiとして再実行}
    if(i%j==0){return j;}
    else{return gcd(j,i%j);}
  } if(i<j){return gcd(j,i);} //大きい方をiとして再実行} i<j i j {return gcd(j,i);} return gcd(j,i); gcd(j,i) gcd j i if(i%j==0){return j;}
    else{return gcd(j,i%j);} i%j==0 i%j i j 0 {return j;} return j; j {return gcd(j,i%j);} return gcd(j,i%j); gcd(j,i%j) gcd j i%j i j long i i long j j public static long lcm(long i,long j){
    return i*j/gcd(i,j);
  } lcm {
    return i*j/gcd(i,j);
  } return i*j/gcd(i,j); i*j/gcd(i,j) i*j i j gcd(i,j) gcd i j long i i long j j public class Main{
    public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);

      long A=sc.nextLong();
      long B=sc.nextLong();
      long C=sc.nextLong();
      long D=sc.nextLong();
      long cnt=0;

      long lcmCD;
      long numAC,numAD,numACD,numBC,numBD,numBCD;
      long ansA,ansB,ans;

      lcmCD=lcm(C,D);

      numAC=(A-1)/C;  //A未満でCの倍数の個数(切り捨てされる)
      numAD=(A-1)/D;  //A未満でDの倍数の個数(切り捨てされる)
      numACD=(A-1)/lcmCD;  //A未満でLCM(C,D)の倍数の個数(切り捨てされる)
      ansA=(A-1)-(numAC+numAD-numACD);  //A未満でC,D,LCMで割り切れない数

      numBC=B/C;  //B以下でCの倍数の個数(切り捨てされる)
      numBD=B/D;  //B以下でDの倍数の個数(切り捨てされる)
      numBCD=B/lcmCD;  //B以下でLCM(C,D)の倍数の個数(切り捨てされる)
      ansB=B-(numBC+numBD-numBCD);  //B以下でC,D,LCMで割り切れない数

      ans=ansB-ansA;

      System.out.println(ans);
    }

  public static long gcd(long i,long j){
    if(i<j){return gcd(j,i);} //大きい方をiとして再実行}
    if(i%j==0){return j;}
    else{return gcd(j,i%j);}
  }
  public static long lcm(long i,long j){
    return i*j/gcd(i,j);
  }

} public class Main{
    public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);

      long A=sc.nextLong();
      long B=sc.nextLong();
      long C=sc.nextLong();
      long D=sc.nextLong();
      long cnt=0;

      long lcmCD;
      long numAC,numAD,numACD,numBC,numBD,numBCD;
      long ansA,ansB,ans;

      lcmCD=lcm(C,D);

      numAC=(A-1)/C;  //A未満でCの倍数の個数(切り捨てされる)
      numAD=(A-1)/D;  //A未満でDの倍数の個数(切り捨てされる)
      numACD=(A-1)/lcmCD;  //A未満でLCM(C,D)の倍数の個数(切り捨てされる)
      ansA=(A-1)-(numAC+numAD-numACD);  //A未満でC,D,LCMで割り切れない数

      numBC=B/C;  //B以下でCの倍数の個数(切り捨てされる)
      numBD=B/D;  //B以下でDの倍数の個数(切り捨てされる)
      numBCD=B/lcmCD;  //B以下でLCM(C,D)の倍数の個数(切り捨てされる)
      ansB=B-(numBC+numBD-numBCD);  //B以下でC,D,LCMで割り切れない数

      ans=ansB-ansA;

      System.out.println(ans);
    }

  public static long gcd(long i,long j){
    if(i<j){return gcd(j,i);} //大きい方をiとして再実行}
    if(i%j==0){return j;}
    else{return gcd(j,i%j);}
  }
  public static long lcm(long i,long j){
    return i*j/gcd(i,j);
  }

} Main
import java.util.*;

public class Main{
    public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);

      long A=sc.nextLong();
      long B=sc.nextLong();
      long C=sc.nextLong();
      long D=sc.nextLong();
      long cnt=0;

      long lcmCD;
      long numAC,numAD,numACD,numBC,numBD,numBCD;
      long ansA,ansB,ans;

      lcmCD=lcm(C,D);

      numAC=(A-1)/C;  //A未満でCの倍数の個数(切り捨てされる)
      numAD=(A-1)/D;  //A未満でDの倍数の個数(切り捨てされる)
      numACD=(A-1)/lcmCD;  //A未満でLCM(C,D)の倍数の個数(切り捨てされる)
      ansA=(A-1)-(numAC+numAD-numACD);  //A未満でC,D,LCMで割り切れない数

      numBC=B/C;  //B以下でCの倍数の個数(切り捨てされる)
      numBD=B/D;  //B以下でDの倍数の個数(切り捨てされる)
      numBCD=B/lcmCD;  //B以下でLCM(C,D)の倍数の個数(切り捨てされる)
      ansB=B-(numBC+numBD-numBCD);  //B以下でC,D,LCMで割り切れない数

      ans=ansB-ansA;

      System.out.println(ans);
    }

  public static long gcd(long i,long j){
    if(i<j){return gcd(j,i);} //大きい方をiとして再実行}
    if(i%j==0){return j;}
    else{return gcd(j,i%j);}
  }
  public static long lcm(long i,long j){
    return i*j/gcd(i,j);
  }

}
