トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
ABC-070-C Multiple Clocks
■■■問題■■■
N台の時計があり、i(1 <= i <= N) 番目の時計の針はちょうどTi秒で時計盤を1周します。
最初、全ての時計の針は真っ直ぐ上に向いており、止まっています。
イルカは、全ての時計の針を同時に動かし始めました。
再び、全ての時計の針が真っ直ぐ上に向くのは何秒後でしょうか?
■■■入力■■■
N
T1
・
・
・
TN
●1 <= N <= 100
●1 <= Ti <= 10の18乗
●入力は全て整数である
●答えは 10の18乗 秒以内である
■■■出力■■■
時計の針を動かし始めてから、再び全ての時計の針が真っ直ぐ上に向くまでの秒数を出力せよ。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("2");
WillReturn.Add("2");
WillReturn.Add("3");
//6
//2つの時計があり、各時計の針が真っ直ぐ上に向くのは以下の時刻です。
//●1番目の時計の針: 時計の針を動かし始めてから、2秒後、4秒後、6秒後、・・・
//●2番目の時計の針: 時計の針を動かし始めてから、3秒後、6秒後、9秒後、・・・
//したがって、2つの時計の針が真っ直ぐ上に向くのにかかる秒数は6秒となります。
}
else if (InputPattern == "Input2") {
WillReturn.Add("5");
WillReturn.Add("2");
WillReturn.Add("5");
WillReturn.Add("10");
WillReturn.Add("1000000000000000000");
WillReturn.Add("1000000000000000000");
//1000000000000000000
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
long[] TArr = InputList.Skip(1).Select(X => long.Parse(X)).Distinct().ToArray();
long AnswerLCM = TArr[0];
for (int I = 1; I <= TArr.GetUpperBound(0); I++) {
long CurrGCD = DeriveGCD(AnswerLCM, TArr[I]);
AnswerLCM = AnswerLCM * (TArr[I] / CurrGCD);
}
Console.WriteLine(AnswerLCM);
}
//ユークリッドの互除法で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;
}
}
}
解説
配列TArrの最小公倍数が解なので、
順番に最小公倍数を求めてます。
公式 A*B = GCM(A,B) * LCM(A,B)
をふまえて、ユークリッドの互除法でGCMを求めてから、LCMを求めてます。