Problem:
Score : 100 points

Problem Statement

There is a simple directed graph G with N vertices, numbered 1, 2, \ldots, N.

For each i and j (1 \leq i, j \leq N), you are given an integer a_{i, j} that represents whether there is a directed edge from Vertex i to j.
If a_{i, j} = 1, there is a directed edge from Vertex i to j; if a_{i, j} = 0, there is not.

Find the number of different directed paths of length K in G, modulo 10^9 + 7.
We will also count a path that traverses the same edge multiple times.

Constraints

All values in input are integers.

1 \leq N \leq 50

1 \leq K \leq 10^{18}

a_{i, j} is 0 or 1.

a_{i, i} = 0

Input

Input is given from Standard Input in the following format:

N K
a_{1, 1} \ldots a_{1, N}
:
a_{N, 1} \ldots a_{N, N}

Output

Print the number of different directed paths of length K in G, modulo 10^9 + 7.

Sample Input 1

4 2
0 1 0 0
0 0 1 1
0 0 0 1
1 0 0 0

Sample Output 1

6

G is drawn in the figure below:

There are six directed paths of length 2:

1 → 2 → 3

1 → 2 → 4

2 → 3 → 4

2 → 4 → 1

3 → 4 → 1

4 → 1 → 2

Sample Input 2

3 3
0 1 0
1 0 1
0 0 0

Sample Output 2

3

G is drawn in the figure below:

There are three directed paths of length 3:

1 → 2 → 1 → 2

2 → 1 → 2 → 1

2 → 1 → 2 → 3

Sample Input 3

6 2
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 1 0
0 0 0 0 0 1
0 0 0 0 0 0

Sample Output 3

1

G is drawn in the figure below:

There is one directed path of length 2:

4 → 5 → 6

Sample Input 4

1 1
0

Sample Output 4

0

Sample Input 5

10 1000000000000000000
0 0 1 1 0 0 0 1 1 0
0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 1 0 1 0 1
1 1 1 0 1 1 0 1 1 0
0 1 1 1 0 1 0 1 1 1
0 0 0 1 0 0 1 0 1 0
0 0 0 1 1 0 0 1 0 1
1 0 0 0 1 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
1 0 1 1 1 0 1 1 1 0

Sample Output 5

957538352

Be sure to print the count modulo 10^9 + 7.

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Linq;
using System.Collections.Generic;

public static class Program {
    static int n;
    static long mod=1000000007;
    public static void Main() {
        long[]nk=Console.ReadLine().Split().Select(long.Parse).ToArray();
        n=(int)nk[0];
        long k=nk[1];
        long[,]a=new long[n,n];
        for(int i=0;i<n;i++){
            int j=0;
            foreach(long x in Console.ReadLine().Split().Select(long.Parse)){
                a[i,j++]=x;
            }
        }
        long[,]c=Pow(a,k);
        long ans=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                ans+=c[i,j];
            }
        }
        ans%=mod;
        Console.WriteLine(ans);

        // for(int i=0;i<n;i++){
        //     Console.Write($"[a[{i}]]");
        //     for(int j=0;j<n;j++){
        //         Console.Write($" {a[i,j]}");
        //     }
        //     Console.Write("\n");
        // }
        // for(int i=0;i<n;i++){
        //     Console.Write($"[c[{i}]]");
        //     for(int j=0;j<n;j++){
        //         Console.Write($" {c[i,j]}");
        //     }
        //     Console.Write("\n");
        // }
    }
    public static long[,] Mul(long[,] a, long[,] b){
        long[,]c=new long[n,n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                for(int k=0;k<n;k++){
                    c[i,j]+=a[i,k]*b[k,j]%mod;
                }
                c[i,j]%=mod;
            }
        }
        return c;
    }
    public static long[,] Pow(long[,]a, long b){
        long[,]c=new long[n,n];
        for(int i=0;i<n;i++)c[i,i]=1;
        for(;b>0;b/=2){
            if(b%2==1)c=Mul(c,a);
            a=Mul(a,a);
        }
        return c;
    }
}