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: Wrong Answer)

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;
            }
            else
            {
                i += i % 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;
        }

        return p * q / n;
    }
}

class Program
{
    static string[] GetStrs()
    {
        var src = Console.ReadLine();
        return src.Split(' ');
    }

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

    static long[] GetNums()
    {
        var src = Console.ReadLine();
        var srcs = src.Split(' ');
        long[] re = new long[srcs.Length];
        for (int i = 0; i < srcs.Length; i++)
        {
            re[i] = long.Parse(srcs[i]);
        }

        return re;
    }

    static long GetNum()
    {
        var src = Console.ReadLine();
        return long.Parse(src);
    }

    static double[] GetDNums()
    {
        var src = Console.ReadLine();
        var srcs = src.Split(' ');
        double[] re = new double[srcs.Length];
        for (int i = 0; i < srcs.Length; i++)
        {
            re[i] = double.Parse(srcs[i]);
        }

        return re;
    }

    static double GetDNum()
    {
        var src = Console.ReadLine();
        return double.Parse(src);
    }

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

    static void Main(string[] args)
    {
        var s = GetNums();
        Write(new Solution().ProcE(s[0], s[1],s[2], s[3]));
    }
}