典型90問    次の典型90問へ    前の典型90問へ

典型90問 052 Dice Product(★3)


問題へのリンク


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("2");
            WillReturn.Add("1 2 3 5 7 11");
            WillReturn.Add("4 6 8 9 10 12");
            //1421
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("1");
            WillReturn.Add("11 13 17 19 23 29");
            //112
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("7");
            WillReturn.Add("19 23 51 59 91 99");
            WillReturn.Add("15 45 56 65 69 94");
            WillReturn.Add("7 11 16 34 59 95");
            WillReturn.Add("27 30 40 43 83 85");
            WillReturn.Add("19 23 25 27 45 99");
            WillReturn.Add("27 48 52 53 60 81");
            WillReturn.Add("21 36 49 72 82 84");
            //670838273
        }
        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 Answer = 1;
        foreach (string EachStr in InputList.Skip(1)) {
            long[] AArr = EachStr.Split(' ').Select(pX => long.Parse(pX)).ToArray();

            long CurrSum = 0;
            foreach (long EachA in AArr) {
                CurrSum += EachA;
                CurrSum %= Hou;
            }
            Answer *= CurrSum;
            Answer %= Hou;
        }
        Console.WriteLine(Answer);
    }
}


解説

1から3までのサイコロと
7から9までのサイコロで考察します。

1*7+1*8+1*9+
2*7+2*8+2*9+
3*7+3*8+3*9
が解ですが
因数分解すると
1*(7+8+9) + 2*(7+8+9) + 3*(7+8+9) = 
(1+2+3) * (7+8+9) になります。
サイコロが増えても同様なので、
サイコロ目の総和同士の積が解だと分かります。