AtCoderのAGC
次のAGCの問題へ
前のAGCの問題へ
AGC018-A Getting Difference
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("3 7");
WillReturn.Add("9 3 4");
//POSSIBLE
}
else if (InputPattern == "Input2") {
WillReturn.Add("3 5");
WillReturn.Add("6 9 3");
//IMPOSSIBLE
}
else if (InputPattern == "Input3") {
WillReturn.Add("4 11");
WillReturn.Add("11 3 7 15");
//POSSIBLE
}
else if (InputPattern == "Input4") {
WillReturn.Add("5 12");
WillReturn.Add("10 2 8 6 4");
//IMPOSSIBLE
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
long[] wkArr = InputList[0].Split(' ').Select(pX => long.Parse(pX)).ToArray();
long K = wkArr[1];
long[] AArr = InputList[1].Split(' ').Select(pX => long.Parse(pX)).ToArray();
long GCD = AArr[0];
for (int I = 1; I <= AArr.GetUpperBound(0); I++) {
GCD = DeriveGCD(GCD, AArr[I]);
}
if (AArr.Max() < K) {
Console.WriteLine("IMPOSSIBLE");
return;
}
if (K % GCD == 0) {
Console.WriteLine("POSSIBLE");
}
else {
Console.WriteLine("IMPOSSIBLE");
}
}
// ユークリッドの互除法で2数の最大公約数を求める
static long DeriveGCD(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;
}
}
}
解説
18 30 といった2つの数で作成可能な数を考察すると
GCDが6で、図で考えると下記になります。
■
■
■■
■■
■■
GCDを単位として、最大値からGCDを引いた数は全て作成可能となります。
また、GCD自体は、ユークリッドの互助法を行えば作成可能です。
以上により、
●Kが数列の最大値以下であること
●KがGCDの倍数であること
の2つを判定してます。