AtCoderのAGC
次のAGCの問題へ
前のAGCの問題へ
AGC009-A Multiple Array
■■■問題■■■
N項からなる数列 A1, ・・・ ,AN があり、N個のボタンがあります。
i(1 <= i <= N) 個目のボタンを押すと、数列Aの1項目からi項目までの値が1ずつ増加します。
数列 B1, ・・・ ,BN が与えられます。
高橋君は、これらのボタンを何回か押して、すべてのiに対し、AiがBiの倍数になるようにします。
高橋君がボタンを押す回数の最小値を求めてください。
■■■入力■■■
N
A1 B1
・
・
・
AN BN
●入力はすべて整数である
●1 <= N <= 10万
●0 <= Ai <= 10億(1 <= i <= N)
●1 <= Bi <= 10億(1 <= i <= N)
■■■出力■■■
高橋君がボタンを押す回数の最小値を表す整数を出力せよ。
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("3");
WillReturn.Add("3 5");
WillReturn.Add("2 7");
WillReturn.Add("9 4");
//7
//1つめのボタンを2回、2つめのボタンを2回、3つめのボタンを3回押せばよいです
}
else if (InputPattern == "Input2") {
WillReturn.Add("7");
WillReturn.Add("3 1");
WillReturn.Add("4 1");
WillReturn.Add("5 9");
WillReturn.Add("2 6");
WillReturn.Add("5 3");
WillReturn.Add("5 8");
WillReturn.Add("9 7");
//22
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
var AList = new List<int>();
var BList = new List<int>();
int[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(X => int.Parse(X)).ToArray();
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
AList.Add(wkArr[0]);
BList.Add(wkArr[1]);
}
long PushCnt = 0;
for (int I = AList.Count - 1; 0 <= I; I--) {
long ModVal = (AList[I] + PushCnt) % BList[I];
if (ModVal == 0) continue;
PushCnt += BList[I] - ModVal;
}
Console.WriteLine(PushCnt);
}
}
解説
右から順に、数値を決定してます。