AtCoderの企業コンテスト
   次の企業コンテストの問題へ
   前の企業コンテストの問題へ
三井住友信託銀行プログラミングコンテスト2019 E Colorful Hats 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("0 1 2 3 4 5");
            //3
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("3");
            WillReturn.Add("0 0 0");
            //6
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("54");
            WillReturn.Add("0 0 1 0 1 2 1 2 3 2 3 3 4 4 5 4 6 5 7 8 5 6 6 7 7 8 8 9 9 10 10 11 9 12 10 13 14 11 11 12 12 13 13 14 14 15 15 15 16 16 16 17 17 17");
            //115295190
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }
    const long Hou = 1000000007;
    static void Main()
    {
        List<string> InputList = GetInputList();
        long[] AArr = InputList[1].Split(' ').Select(pX => long.Parse(pX)).ToArray();
        var CntDict = new Dictionary<char, long>();
        CntDict['R'] = 0;
        CntDict['G'] = 0;
        CntDict['B'] = 0;
        long Answer = 1;
        foreach (long EachA in AArr) {
            // 個数が一致する色が何色あるかを調べる
            long KouhoColorCnt = CntDict.Values.Count(pX => pX == EachA);
            // 場合の数の積の法則
            Answer *= KouhoColorCnt;
            Answer %= Hou;
            //Console.WriteLine("KouhoColorCnt={0},Answer={1}", KouhoColorCnt, Answer);
            foreach (char EachKey in CntDict.Keys) {
                if (CntDict[EachKey] == EachA) {
                    CntDict[EachKey]++;
                    break;
                }
            }
        }
        Console.WriteLine(Answer);
    }
}
解説
3色ではなく
チェスセットで白と黒の2色のポーンを使って
先頭から、白ポーン優先で設置する形で考察します。
   0 1 0 1 2 といった場合は
白 1 2 2 2 3
黒 0 0 1 2 2
となります。
樹形図をイメージすると、
白優先で設置したので、黒も可能だった場所では、
場合の数の積の法則で、解に2を掛ける必要があります。