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# (Mono 4.6.2.0) (judge verdict: Runtime Error)

using System;

class Solution
{
    public long Proc(long a, long b, long c, long d)
    {
        //long cnt = 0;
        //for (long i = a; i < b; i++)
        //{
        //    if (i % c != 0 && i % d != 0) cnt++;
        //}
        //return cnt;

        return ProcE(a, b, c, d);
    }

    public long ProcE(long a, long b, long c, long d)
    {
        long v = Math.Abs( b - a);
        return v - ((v / c) + (v / d) - (v / getp(c,d)));
    }

    //public long ProcD(long a, long b, long c, long d)
    //{
    //    long cp = 1;
    //    long dp = 1;
    //    long m=0;
    //    while (true)
    //    {
    //        if(c*cp== d*dp)
    //        {
    //            m= c*cp;
    //            break;
    //        }
    //        if (c * cp < d * dp) cp++;
    //        else dp++;
    //    }
    //    long v = b - a;
        
    //    return v - ((v / c) + (v / d) - (v/m));
    //}

    //public long ProcC(long a, long b, long c, long d)
    //{
    //    long first = a;
    //    for (long i = a; i < b; i++)
    //    {
    //        if (i % c == 0)
    //        {
    //            first = i;
    //            break;
    //        }
    //    }

    //    int minus = 0;
    //    for (long i = first; i <= b; i += c)
    //    {
    //        if (i % d == 0) minus++;
    //    }

    //    long v = b - a;
    //    long sum = (v / c) + (v / d) - minus;
    //    return v - sum;
    //}

    public long getp(long c, long d)
    {
        long p = c>d?c:d;
        long q = c < d ? c : d;
        long m = p ;
        long n = q ;

        while (true)
        {
            if (m % n == 0) break;

            long t = m % n;
            m = n;
            n = t;
        }

        return p * q / n;
    }
}

class Program
{
    static string[] GetVals(string splitChar)
    {
        var src = Console.ReadLine();
        return src.Split(new string[] { splitChar }, StringSplitOptions.None);
    }

    static string[] GetVals(char splitChar)
    {
        var src = Console.ReadLine();
        return src.Split(splitChar);
    }

    static string GetVal()
    {
        return Console.ReadLine();
    }

    static void Write(object o)
    {
        Console.WriteLine(String.Format("{0}", o));
    }

    static int ParseI(string val) { return int.Parse(val); }
    static double ParseD(string val) { return double.Parse(val); }

    static void Main(string[] args)
    {
        var s = GetVals(' ');
        Write(new Solution().Proc(int.Parse(s[0]), int.Parse(s[1]),
            int.Parse(s[2]), int.Parse(s[3])));

        //Write(new Solution().Proc(-4, 9, 2, 3));//2
        //Write(new Solution().Proc(10, 40, 6, 8));//23
        //Write(new Solution().Proc(314159265358979323, 846264338327950288, 419716939, 937510582));//
        //GetVal();
    }
}