Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

ニュータウン

会津県では人口増加のためにニュータウンを作ることにしました。そのために、新たに長方形の土地を開拓し、この土地を余すところなく、すべて同じ大きさの正方形からなる区画に区切ることを決めました。この土地の整備には、区画数に比例した費用がかかりますが、県としてはこの費用を最小にしたいと考えています。

新たに開拓した土地の東西方向と南北方向の長さと、１区画当たりの整備費用が与えられたとき、すべての区画を整備したときにかかる、最小の整備費用を求めるプログラムを作成せよ。

Input

入力は以下の形式で与えられる。

W H C

入力は１行であり、新たに開拓した土地の東西方向の長さ W (1 ≤ W ≤ 1000)と南北方向の長さ H (1 ≤ H ≤ 1000)、区画当たりの整備費用 C (1 ≤ C ≤ 1000)が整数で与えられる。

Output

土地を整備するために必要な最小の費用を１行に出力する。

Sample Input 1

10 20 5

Sample Output 1

10

２個の正方形で土地を余すところなく区切ることができ、１区画当たりの整備費用が５なので、１０と
出力する。

Sample Input 2

27 6 1

Sample Output 2

18

１８個の正方形で土地を余すところなく区切ることができ、１区画当たりの整備費用が１なので、１８と出力する。

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO.Compression;
using System.IO.Pipes;
using System.Linq;
using System.Numerics;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using static System.Console;
using static System.Math;

namespace AtCoder
{
    class Program
    {
        static void Main(string[] args)
        {
            var WHC = ReadInts();
            var W = WHC[0];
            var H = WHC[1];
            var C = WHC[2];

            var a = Gcd(W, H);

            var ans = (W / a) * (H / a);
            WriteLine(ans*C);
        }
        //最大公約数
        public static int Gcd(int a, int b)
        {
            if (a < b)
            {
                return Gcd(b, a);
            }
            while (b != 0)
            {
                var reminder = a % b;
                a = b;
                b = reminder;
            }
            return a;
        }

        private static string Read() { return ReadLine(); }
        private static string[] Reads() { return (Read().Split()); }
        private static int ReadInt() { return int.Parse(Read()); }
        private static long ReadLong() { return long.Parse(Read()); }
        private static double ReadDouble() { return double.Parse(Read()); }
        private static int[] ReadInts() { return Array.ConvertAll(Read().Split(), int.Parse); }
        private static long[] ReadLongs() { return Array.ConvertAll(Read().Split(), long.Parse); }
        private static double[] ReadDoubles() { return Array.ConvertAll(Read().Split(), double.Parse); }
    }
}