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

ABC200-C Ringo's Favorite Numbers 2


問題へのリンク


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("6");
            WillReturn.Add("123 223 123 523 200 2000");
            //4
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("5");
            WillReturn.Add("1 2 3 4 5");
            //0
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("8");
            WillReturn.Add("199 100 200 400 300 500 600 200");
            //9
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();

        long[] AArr = InputList[1].Split(' ').Select(pX => long.Parse(pX)).ToArray();
        long UB = AArr.GetUpperBound(0);

        // mod 200 に変更する
        for (long I = 0; I <= UB; I++) {
            AArr[I] %= 200;
        }

        long Answer = 0;
        foreach (var Item in AArr.GroupBy(pX => pX)) {
            Answer += Item.LongCount() * (Item.LongCount() - 1) / 2;
        }
        Console.WriteLine(Answer);
    }
}


解説

mod 200 で考えて、一致する組み合わせの数を集計してます。

10^9 * 10^9 は、Int型だとオーバーフローするので、
LINQのLongCountメソッドを使ってます。