典型90問
次の典型90問へ
前の典型90問へ
典型90問 022 Cubic Cake(★2)
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("2 2 3");
//4
}
else if (InputPattern == "Input2") {
WillReturn.Add("2 2 4");
//1
}
else if (InputPattern == "Input3") {
WillReturn.Add("1000000000000000000 999999999999999999 999999999999999998");
//2999999999999999994
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
long[] ABCArr = InputList[0].Split(' ').Select(pX => long.Parse(pX)).ToArray();
long GCD = DeriveGCD(ABCArr);
long Answer = 0;
foreach (long EachVal in ABCArr) {
// (GCDとの差)/GCDの総和が解
Answer += (EachVal - GCD) / GCD;
}
Console.WriteLine(Answer);
}
// 列挙を引数として、最大公約数を返す
static long DeriveGCD(IEnumerable<long> pEnum)
{
long GCD = pEnum.First();
foreach (long EachLong in pEnum) {
GCD = DeriveGCD2(GCD, EachLong);
}
return GCD;
}
// ユークリッドの互除法で2数の最大公約数を求める
static long DeriveGCD2(long pVal1, long pVal2)
{
long WarareruKazu = pVal2;
long WaruKazu = pVal1;
while (true) {
long Amari = WarareruKazu % WaruKazu;
if (Amari == 0) return WaruKazu;
WarareruKazu = WaruKazu;
WaruKazu = Amari;
}
}
}
解説
2次元平面で正方形で敷き詰めることを考えると
GCDを正方形の1辺にするのが最適と分かります。
同様に考えて、
3次元平面では、GCDを立方体の1辺にするのが最適です。