AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC177-E Coprime
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");
WillReturn.Add("3 4 5");
//pairwise coprime
}
else if (InputPattern == "Input2") {
WillReturn.Add("3");
WillReturn.Add("6 10 15");
//setwise coprime
}
else if (InputPattern == "Input3") {
WillReturn.Add("3");
WillReturn.Add("6 10 16");
//not coprime
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
long[] AArr = InputList[1].Split(' ').Select(pX => long.Parse(pX)).ToArray();
bool IsPairwiseCoprime = true;
var SoinSuuSet = new HashSet<long>();
foreach (long EachLong in AArr) {
Dictionary<long, long> SoinsuuDict = DeriveSoinsuuDict(EachLong);
if (SoinSuuSet.Overlaps(SoinsuuDict.Keys)) {
IsPairwiseCoprime = false;
break;
}
SoinSuuSet.UnionWith(SoinsuuDict.Keys);
}
if (IsPairwiseCoprime) {
Console.WriteLine("pairwise coprime");
return;
}
long CurrGCD = AArr[0];
foreach (long EachLong in AArr) {
CurrGCD = DeriveGCD(CurrGCD, EachLong);
if (CurrGCD == 1) {
Console.WriteLine("setwise coprime");
return;
}
}
Console.WriteLine("not coprime");
}
// 素因数分解し、指数[素数]なDictを返す
static Dictionary<long, long> DeriveSoinsuuDict(long pTarget)
{
var WillReturn = new Dictionary<long, long>();
long CurrVal = pTarget;
// ルートより大きい数を、素因素に持つとしても、1つだけのため
// ルートまで試し割りを行い、素因数が残っていたら、追加する
for (long I = 2; I * I <= pTarget; I++) {
if (CurrVal % I > 0) continue;
WillReturn[I] = 0;
while (CurrVal % I == 0) {
WillReturn[I]++;
CurrVal /= I;
}
if (CurrVal == 1) break;
}
// 素因数が残っている場合
if (CurrVal > 1) {
WillReturn[CurrVal] = 1;
}
return WillReturn;
}
// ユークリッドの互除法で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;
}
}
}
解説
素因数分解を繰り返して
登場した素因数をHashsetで管理しつつ、
pairwise coprimeを判定してます。