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# (.NET Core 3.1.201) (judge verdict: Accepted)

using System;
//F[A->B]の数を求めるときはF[B]-F[A-1]とすると楽

namespace C
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] In = Console.ReadLine().Split(' ');
            long a = long.Parse(In[0]);
            long b = long.Parse(In[1]);
            long c = int.Parse(In[2]);
            long d = int.Parse(In[3]);
            long lcm = Lcm(c, d);
            //F[B]について
            long FB = b - (b / c) - (b / d) + (b / lcm);
            //F[A-1]について
            long FA = a - 1 - ((a - 1) / c) - ((a - 1) / d) + ((a - 1) / lcm);
            Console.WriteLine(FB - FA);
        }
        public static long Lcm(long a, long b)
        {
            return a * b / Gcd(a, b);
        }
        static long Gcd(long m, long n)
        {
            if (n == 0) return m;
            return Gcd(n, m % n);
        }
    }
}
//TLE
//namespace C
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            string[] In = Console.ReadLine().Split(' ');
//            long a = long.Parse(In[0]);
//            long b = long.Parse(In[1]);
//            long c = int.Parse(In[2]);
//            long d = int.Parse(In[3]);
//            long cc = 0;
//            long dd = 0;
//            long cdcd = 0;
//            int t = 1;
//            while (c * t <= b)
//            {
//                if (a <= c * t) cc++;
//                t++;
//            }
//            t = 1;
//            while (d * t <= b)
//            {
//                if (a <= d * t) dd++;
//                t++;
//            }
//            long cd = Lcm(c, d);
//            t = 1;
//            while (cd * t <= b)
//            {
//                if (a <= cd * t) cdcd++;
//                t++;
//            }
//            Console.WriteLine((b-a+1)-(cc+dd-cdcd));
//        }
//        public static long Lcm(long a, long b)
//        {
//            return a * b / Gcd(a, b);
//        }
//        static long Gcd(long m, long n)
//        {
//            if (n == 0) return m;
//            return Gcd(n, m % n);
//        }
//    }
//}

//配列が長すぎてコンパイルできない
//namespace C
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            long border = (long)Math.Pow(10, 18);
//            bool[] B = new bool[border+1];
//            string[] In = Console.ReadLine().Split(' ');
//            long a = long.Parse(In[0]);
//            long b = long.Parse(In[1]);
//            long c = int.Parse(In[2]);
//            long d = int.Parse(In[3]);
//            int t = 1;
//            while (c*t <= border)
//            { 
//                B[c*t] = true;
//                t++;

//            }
//            t = 1; 
//            while (d*t <= border)
//            {
//                B[d*t] = true;
//                t++;
//            }
//            long ans = 0;
//            for(long i=a; i <= b; i++)
//            {
//                if (B[i]) ans++;
//            }
//            Console.WriteLine(ans);
//        }
//    }
//}