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なのか分からないので
下位類題で整数問題の理解を深めてから、再度考える