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 = b - a;
        long m1 = GetNums(a, b, c);
        long m2 = GetNums(a, b, d);
        long m3 = GetNums(a, b, getp(c, d));
        return v-m1-m2+m3;
    }

    public long GetNums(long a, long b, long val)
    {
        long v = Math.Abs( b - a);
        val = Math.Abs(val);
        for (long i = a; i < b; i++)
        {
            v--;
            if (i % val == 0)
            {
                return v / val + 1;
            }
            
        }

        return 0;
    }

    public long getp(long c, long d)
    {
        c = Math.Abs(c);
        d = Math.Abs(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;
        }

        if (n == 0) n = 1;

        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().ProcE(int.Parse(s[0]), int.Parse(s[1]),
            int.Parse(s[2]), int.Parse(s[3])));


    }
}