AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC142-D Disjoint Set of Common Divisors
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("12 18");
//3
}
else if (InputPattern == "Input2") {
WillReturn.Add("420 660");
//4
}
else if (InputPattern == "Input3") {
WillReturn.Add("1 2019");
//1
}
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 A = wkArr[0];
long B = wkArr[1];
Dictionary<long, long> SoinsuuDict1 = DeriveSoinsuuDict(A);
Dictionary<long, long> SoinsuuDict2 = DeriveSoinsuuDict(B);
var AnswerSet = new HashSet<long>();
AnswerSet.Add(1);
// 公約数の中で素数のSet
AnswerSet.UnionWith(SoinsuuDict1.Keys.Intersect(SoinsuuDict2.Keys));
Console.WriteLine(AnswerSet.Count);
}
// 素因数分解し、指数[素数]な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;
}
}
解説
AとBの公約数から複数の数を選び
どの2つのペアも互いに素である必要があるので
1は必ず選ぶことができます。
また、合成数を選ぶなら、その合成数の元になる、素数を選ぶほうが得です。
なのでAとBの公約数の中で素数の個数に1を足すと解になります。