競技プログラミングの鉄則    次の問題へ    前の問題へ

C10 A Long Grid


問題へのリンク


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("1");
            //12
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("2");
            //84
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("100");
            //908287499
        }
        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 W = long.Parse(InputList[0]);

        // 1列目は4*3で12通り
        long Retu1 = 4 * 3;
        if (W == 1) {
            Console.WriteLine(Retu1);
            return;
        }
        long Bekijyou = DeriveBekijyou(7, W - 1, Hou);
        long Answer = Retu1 * Bekijyou;
        Answer %= Hou;
        Console.WriteLine(Answer);
    }

    // 繰り返し2乗法で、(NのP乗) Mod Mを求める
    static long DeriveBekijyou(long pN, long pP, long pM)
    {
        long CurrJyousuu = pN % pM;
        long CurrShisuu = 1;
        long WillReturn = 1;

        while (true) {
            // 対象ビットが立っている場合
            if ((pP & CurrShisuu) > 0) {
                WillReturn = (WillReturn * CurrJyousuu) % pM;
            }

            CurrShisuu *= 2;
            if (CurrShisuu > pP) return WillReturn;
            CurrJyousuu = (CurrJyousuu * CurrJyousuu) % pM;
        }
    }
}


解説

色を1234で扱います。

最初の1列目は
1
2
で固定します。
すると下記のマトリックスにより
2列目は、7通りだと分かります。

2列目の上と下のマトリックス表
  1 2 3 4
1 x o o o
2 x x x x
3 x o x o
4 x o o x

後は、繰り返し2乗法と、最初の1列目が
4*3で12通りあることから、解を求めることができます。