Problem:
Score : 300 points

Problem Statement

Takahashi is organizing a party.

At the party, each guest will receive one or more snack pieces.

Takahashi predicts that the number of guests at this party will be A or B.

Find the minimum number of pieces that can be evenly distributed to the guests in both of the cases predicted.

We assume that a piece cannot be divided and distributed to multiple guests.

Constraints

1 \leq A, B \leq 10^5

A \neq B

All values in input are integers.

Input

Input is given from Standard Input in the following format:

A B

Output

Print the minimum number of pieces that can be evenly distributed to the guests in both of the cases with A guests and B guests.

Sample Input 1

2 3

Sample Output 1

6

When we have six snack pieces, each guest can take three pieces if we have two guests, and each guest can take two if we have three guests.

Sample Input 2

123 456

Sample Output 2

18696

Sample Input 3

100000 99999

Sample Output 3

9999900000

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Linq;
using System.Collections.Generic;

using E = System.Linq.Enumerable;

using SyrupBeans.Competitive.Integer;

public class Program
{
    public static void Main()
    {
        var ab = Console.ReadLine().Split().Select(x => int.Parse(x)).ToArray();
        var a = ab[0];
        var b = ab[1];
        Console.WriteLine(a / Divisibility.FindGcd(a, b) * b);
    }
}

namespace SyrupBeans.Competitive.Integer
{
    using Integer = System.Int64;

    using System;
    using System.Collections.Generic;
    using System.Linq;

    public static class Divisibility
    {
        /// <summary>O(log min(<paramref name="x" />, <paramref name="y" />))</summary>
        public static Integer FindGcd(Integer x, Integer y) => x < 1 ? y : FindGcd(y % x, x);

        /// <summary>O(sqrt(<paramref name="x" />))</summary>
        public static IEnumerable<Integer> EnumerateDivisors(Integer x)
        {
            var cache = new Stack<Integer>();
            for (Integer i = 1; i * i <= x; ++i)
            {
                Integer r, d = Math.DivRem(x, i, out r);
                if (r != 0)
                {
                    continue;
                }
                yield return i;
                cache.Push(d);
            }
            if (cache.Any() && cache.Peek() * cache.Peek() == x)
            {
                cache.Pop();
            }
            while (cache.Any())
            {
                yield return cache.Pop();
            }
        }
    }
}