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

ABC324-D Square Permutation


問題へのリンク


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("4");
            WillReturn.Add("4320");
            //2
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("3");
            WillReturn.Add("010");
            //2
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("13");
            WillReturn.Add("8694027811503");
            //840
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        string S = InputList[1];

        string SortedS = new string(S.ToCharArray().OrderByDescending(pX => pX).ToArray());

        long LimitVal = long.Parse(SortedS);

        var HeihousuuSet = new HashSet<long>();
        for (long I = 0; I * I <= LimitVal; I++) {
            HeihousuuSet.Add(I * I);
        }

        long Answer = 0;
        foreach (long EachLong in HeihousuuSet) {
            string StrVal = EachLong.ToString();
            if (StrVal.Length < S.Length) {
                StrVal = StrVal.PadLeft(S.Length, '0');
            }

            // マルチセットな集合として一致すること
            char[] CharArr = StrVal.OrderByDescending(pX => pX).ToArray();

            if (CharArr.SequenceEqual(SortedS)) {
                Answer++;
            }
        }
        Console.WriteLine(Answer);
    }
}


解説

31415926535000
を並べ替えて平方数にできるかを考えると
31415926535000以下の平方数を列挙し、
それぞれについて、
並べ替えで作成できるかを調べれば良いと分かります。