AtCoderのABC    次のABCの問題へ    前のABCの問題へ

ABC414-C Palindromic in Both Bases


問題へのリンク


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("8");
            WillReturn.Add("1000");
            //2155
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("8");
            WillReturn.Add("999999999999");
            //914703021014
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("6");
            WillReturn.Add("999999999999");
            //283958331810
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        long Sinsuu = long.Parse(InputList[0]);
        long Limit = long.Parse(InputList[1]);

        long Answer = 0;

        // 1桁の数
        for (long I = 1; I <= 9; I++) {
            string CurrVal1 = I.ToString();

            long OddVal = long.Parse(CurrVal1);
            if (OddVal > Limit) break;

            string Change10BaseStr = Change10Base(OddVal, Sinsuu);
            if (IsKaibun(Change10BaseStr)) {
                Answer += OddVal;
            }
        }

        for (long I = 1; I < long.MaxValue; I++) {
            string wkStr1 = I.ToString();
            string wkStr2 = GetRevStr(I.ToString());

            string EvenStr = wkStr1 + wkStr2;

            long EvenVal = long.Parse(EvenStr);
            if (EvenVal > Limit) break;

            string Change10BaseStr = Change10Base(EvenVal, Sinsuu);
            if (IsKaibun(Change10BaseStr)) {
                Answer += EvenVal;
            }

            for (long J = 0; J <= 9; J++) {
                string OddStr = wkStr1 + J.ToString() + wkStr2;

                long OddVal = long.Parse(OddStr);
                if (OddVal > Limit) break;

                string Change10BaseStr2 = Change10Base(OddVal, Sinsuu);
                if (IsKaibun(Change10BaseStr2)) {
                    Answer += OddVal;
                }
            }
        }
        Console.WriteLine(Answer);
    }

    ////////////////////////////////////////////////////////////////
    // string型を引数とし、reverse
    ////////////////////////////////////////////////////////////////
    static string GetRevStr(string pStr)
    {
        char[] wkArr = pStr.ToCharArray();
        Array.Reverse(wkArr);
        return new string(wkArr);
    }

    ////////////////////////////////////////////////////////////////
    // string型を引数とし、回文判定を行う
    ////////////////////////////////////////////////////////////////
    static bool IsKaibun(string pStr)
    {
        int UB = pStr.Length - 1;
        for (int I = 0; I <= UB / 2; I++) {
            int PairInd = UB - I;
            if (pStr[I] != pStr[PairInd]) {
                return false;
            }
        }
        return true;
    }

    ////////////////////////////////////////////////////////////////
    // 10進数をK進数に変換して返す
    ////////////////////////////////////////////////////////////////
    static string Change10Base(long pDecVal, long pK)
    {
        if (pDecVal == 0) return "0";

        var ModList = new List<long>();
        while (pDecVal > 0) {
            long Mod = pDecVal % pK;
            ModList.Add(Mod);
            pDecVal /= pK;
        }
        ModList.Reverse();

        var sb = new System.Text.StringBuilder();
        ModList.ForEach(pX => sb.Append(pX));
        return sb.ToString();
    }
}


解説

奇数長の10進回文と
偶数長の10進回文を列挙し、
進数変換しても回文かをチェックしてます。