AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC150-B Make Divisible
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("5");
WillReturn.Add("11 23");
WillReturn.Add("8 16");
WillReturn.Add("4394 993298361");
WillReturn.Add("95392025 569922442");
WillReturn.Add("8399283 10293");
//2
//0
//65
//2429708
//8388990
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static long mA;
static long mB;
static void Main()
{
List<string> InputList = GetInputList();
var sb = new System.Text.StringBuilder();
foreach (string EachStr in InputList.Skip(1)) {
long[] wkArr = EachStr.Split(' ').Select(pX => long.Parse(pX)).ToArray();
mA = wkArr[0];
mB = wkArr[1];
if (mA >= mB) {
sb.Append(mA - mB);
sb.AppendLine();
continue;
}
long CurrKouho = mB - mA;
for (long I = 0; I < 100000; I++) {
CurrKouho = Math.Min(CurrKouho, Solve1(I));
}
for (long I = 2; I < 100000; I++) {
CurrKouho = Math.Min(CurrKouho, Solve2(I));
}
sb.Append(CurrKouho);
sb.AppendLine();
}
Console.Write(sb.ToString());
}
// Xを指定して解を求める
static long Solve1(long pX)
{
long Hou = mA + pX;
long ModVal = mB % Hou;
if (ModVal == 0) {
return pX;
}
return pX + Hou - ModVal;
}
// Kを指定して解を求める
static long Solve2(long pK)
{
long Katanuki = pK;
long Seppen = pK * mA - mB;
// 切片が0以上の場合
if (Seppen >= 0) {
return Seppen;
}
// 切片が負の場合
else {
long AbsVal = Math.Abs(Seppen);
if (AbsVal % Katanuki == 0) {
return AbsVal / Katanuki;
}
else {
long Syou = AbsVal / Katanuki;
long Rest = Math.Abs(AbsVal - (Katanuki * (Syou + 1)));
return Syou + 1 + Rest;
}
}
}
}
解説
2022-10-18
解説を読んて、実装してみが、なぜこの上限設定でACなのか分からないので
下位類題で整数問題の理解を深めてから、再度考える